2017-03-21 2 views
1

Ich bin neu in Material Design. Während ich über die Anzeige eine snackbar war auf der Suche, ich sehe es zwei verschiedene Möglichkeiten gibt, es zu tun:Erstes Argument der Snackbar.make() Methode in Android

new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(mCoordinatorLayout,... 
}} 
new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view,... 
}} 

Beiden zwei funktioniert perfekt. Ich habe nicht verstanden warum? Ich denke View bezieht sich auf Button Objekt und mCoordinatorLayout bezieht sich auf CoordinatorLayout Objekt. Sie sind unterschiedliche Objekte, aber eines von zweien kann als erstes Argument der Snackbar.make() -Methode gegeben werden. Warum?

Der vollständige Quellcode ist wie folgt:

Haupt Layout:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout ... > 

<Button 
    android:id="@+id/showSnackbarButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:text="@string/show_snackbar"/> 

</android.support.design.widget.CoordinatorLayout> 

Haupttätigkeit:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mCoordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinatorLayout); 

    mShowSnackbarButton = (Button) findViewById(R.id.showSnackbarButton); 
    mShowSnackbarButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(mCoordinatorLayout, 
        "This is a simple Snackbar", Snackbar.LENGTH_LONG) 
        .setAction("CLOSE", new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          // Custom action 
          Toast.makeText(MainActivity.this,"this is a toast message", Toast.LENGTH_SHORT).show(); 
         } 
        }).show(); 
     } 
    }); 
} 

Antwort

0

Wenn Sie die CoordinatorLayout passieren direkt wird es vermeiden, "going up" in der Hierarchie, um ein CoordinatorLayout zu finden. So sparen Sie etwas Rechenleistung.

Wenn Sie eine Ansicht verwenden, wird es versuchen, einen CoordinatorLayout oder Rückfall auf dem das Fenster Dekor Inhalt Ansicht zu finden.

Dies ist die Methode in Snackbar, die eine „geeignete Eltern“ zu finden verwendet wird:

private static ViewGroup findSuitableParent(View view) { 
    ViewGroup fallback = null; 
    do { 
     if (view instanceof CoordinatorLayout) { 
      // We've found a CoordinatorLayout, use it 
      return (ViewGroup) view; 
     } else if (view instanceof FrameLayout) { 
      if (view.getId() == android.R.id.content) { 
       // If we've hit the decor content view, then we didn't find a CoL in the 
       // hierarchy, so use it. 
       return (ViewGroup) view; 
      } else { 
       // It's not the content view but we'll use it as our fallback 
       fallback = (ViewGroup) view; 
      } 
     } 

     if (view != null) { 
      // Else, we will loop and crawl up the view hierarchy and try to find a parent 
      final ViewParent parent = view.getParent(); 
      view = parent instanceof View ? (View) parent : null; 
     } 
    } while (view != null); 

    // If we reach here then we didn't find a CoL or a suitable content view so we'll fallback 
    return fallback; 
} 
1

Es ist eigentlich ganz einfach.

Wenn Sie einen Blick auf den Sourcecode für die Snackbar haben werden Sie sehen, dass, wenn die Snackbar, die einen Aufruf zu einer privaten Methode findSuitableParent genannt es, die nimmt einen View (die Ansicht, die Sie geben) und weiterhin eine Schleife durch die Sehen Sie sich die Hierarchie an, bis sie entweder CoordinatorLayout oder contentView findet. Dies ist die Ansicht, die alles auf Ihrem Bildschirm enthält.

Siehe: https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/Snackbar.java#133

Wo die findSuitableParent(View view) aus aufgerufen wird.

fand ich darüber, wenn Sie den Code für ein Projekt gabeln, wo ich die Snackbar von unten nach oben auf dem Bildschirm ;-)

hoffte, das hilft zu bewegen hatte.

Verwandte Themen