2015-11-07 4 views
7

Ich versuche, etwas über das Android-Betriebssystem zu lernen und während ich die Google I/O 2014 App gelesen habe, bin ich auf die WindowInsets gestoßen. Wenn jemand erklären kann, was sie sind, dann wäre es eine große Hilfe. Vielen Dank.Was sind WindowInsets?

Antwort

1

Sie können alles über WindowInsets here. lernen WindowInsets bietet Ihnen den Bereich auf dem Fenster, die von der Anwendung verwendet werden kann. Für sich genommen ist es nicht von großem Nutzen. Der wahre Zweck kommt, wenn Sie entweder View.onApplyWindowInsets überschreiben oder View.OnApplyWindowInsetsListener implementieren. Sie können hier über sie lesen: View.onApplyWindowInsets und View.OnApplyWindowInsetsListener

Listener für in einer benutzerdefinierten Art und Weise auf einem Sichtfenster Einsätze Anwendung.

Apps können diese Schnittstelle implementieren, wenn sie die benutzerdefinierte Richtlinie auf die Art und Weise anwenden möchten, wie Fenstereinfügungen für eine Ansicht behandelt werden. Wenn ein OnApplyWindowInsentsListener festgelegt ist, wird seine onApplyWindowInsets-Methode anstelle der eigenen onApplyWindowInsets-Methode des Views aufgerufen. Der Listener kann optional den Parameter Views onApplyWindowInsets aufrufen, um das normale Verhalten der View als Teil zu übernehmen.

Kurz gesagt, durch Überschreiben können Sie den Bereich des für Ihre Ansicht verfügbaren Fensters steuern.

26

WindowInsets sind Einsätze (oder Größen) von Systemansichten (z. B. Statusleiste, Navigationsleiste), die auf das Fenster angewendet werden.

Es wäre leicht zu konkreten Beispiel zu verstehen. Bild dieses Szenario:

enter image description here

Nun wollen Sie nicht WindowInsets auf den ImageView Hintergrund angewendet werden, da in diesem Fall die ImageView würde durch Statusleiste Höhe aufgefüllt werden.

Aber Sie wollen, dass Einsätze auf Toolbar angewendet werden, weil sonst Toolbar würde irgendwo Mitte Statusleiste gezeichnet werden.

Der Blick erklärt den Wunsch WindowInsets in xml anzuwenden, indem er sagte:

android:fitsSystemWindows="true" 

In diesem Beispiel nicht die WindowInsets an die Wurzel Layout anwenden können, weil die Wurzel Layout WindowInsets verbrauchen würde, und die ImageView wäre gepolstert.

Stattdessen können Sie ViewCompat.setOnApplyWindowInsetsListener verwenden Einsätze gelten Symbolleiste:

ViewCompat.setOnApplyWindowInsetsListener(toolbar, (v, insets) -> { 
      ((ViewGroup.MarginLayoutParams) v.getLayoutParams()).topMargin = 
        insets.getSystemWindowInsetTop(); 
      return insets.consumeSystemWindowInsets(); 
     }); 

Hinweis, dieser Rückruf genannt werden würde, wenn Toolbar ‚s Wurzel Layout WindowsInsets seiner Kinder geht. Layouts wie FrameLayout, LinearLayout nicht, DrawerLayout, CoordinatorLayout tun.

Sie können Ihr Layout, z.FrameLayout und außer Kraft setzen onApplyWindowInsets:

@TargetApi(Build.VERSION_CODES.KITKAT_WATCH) 
@Override 
public WindowInsets onApplyWindowInsets(WindowInsets insets) { 
    int childCount = getChildCount(); 
    for (int index = 0; index < childCount; index++) 
     getChildAt(index).dispatchApplyWindowInsets(insets); // let children know about WindowInsets 

    return insets; 
} 

Es gibt eine nice blog post at medium von Ian See dieses Zeug über, auch "Becoming a master window fitter" Präsentation von Chris Banes.

Ich habe auch a detailed article at Medium über WindowInset s erstellt.

Weitere Informationen:

+0

So um den Einsatz in einer Linearlayout ich es anwenden müssen Unterklasse richtig? – lupsyn