2015-11-07 23 views
7

Sto cercando di conoscere il sistema operativo Android e mentre leggevo l'app Google I/O 2014, mi sono imbattuto nello WindowInsets. Se qualcuno può spiegare cosa sono, allora sarebbe di grande aiuto. Grazie.Cosa sono WindowInsets?

risposta

1

È possibile conoscere tutto su WindowInsets here.WindowInsets fornisce l'area sulla finestra che è utilizzabile dall'applicazione. Di per sé non è molto utile. Il vero scopo viene quando si sostituisce View.onApplyWindowInsets o si implementa View.OnApplyWindowInsetsListener. Si può leggere su di loro qui: View.onApplyWindowInsets e View.OnApplyWindowInsetsListener

Listener per l'applicazione di inserti finestra su una vista in un modo personalizzato.

Le app possono scegliere di implementare questa interfaccia se desiderano applicare la politica personalizzata al modo in cui le finestre vengono trattate per una vista. Se è impostato un OnApplyWindowInsetsListener, verrà chiamato il metodo onApplyWindowInsets anziché il metodo onApplyWindowInsets. Il listener può chiamare facoltativamente il metodo ViewViewApplyWindowInsets per applicare il comportamento normale della vista come parte .

In breve, ignorando questa opzione è possibile controllare l'area della finestra disponibile per la visualizzazione.

26

WindowInsets sono insiemi (o dimensioni) di viste di sistema (ad esempio barra di stato, barra di navigazione), che vengono applicati alla finestra.

Sarebbe facile da capire sull'esempio concreto. Immagine questo scenario:

enter image description here

Ora, non si vuole WindowInsets da applicare allo sfondo ImageView, perché in tal caso il ImageView sarebbe imbottita per l'altezza barra di stato.

Ma si desidera applicare gli inserimenti a Toolbar, perché altrimenti Toolbar verrebbe disegnato da qualche parte sulla barra di stato.

La vista dichiara il desiderio di applicare WindowInsets in xml dicendo:

android:fitsSystemWindows="true" 

In questo esempio, non è possibile applicare la WindowInsets al layout radice, perché il layout radice sarebbe consumare WindowInsets, e il ImageView sarebbe imbottito.

Invece è possibile utilizzare ViewCompat.setOnApplyWindowInsetsListener per applicare inserti di barra degli strumenti:

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

Nota, questo callback sarebbe chiamato, quando il layout radice Toolbar s' passa WindowsInsets ai suoi figli. Layout come FrameLayout, LinearLayout no, DrawerLayout, CoordinatorLayout fare.

È possibile sottoclasse il layout, ad es.FrameLayout e sovrascrivere 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; 
} 

C'è un nice blog post at medium da Ian Lago riguardo a questa roba, anche "Becoming a master window fitter" presentazione da Chris Banes.

Ho anche creato a detailed article at Medium relativo a WindowInset s.

Altre risorse:

+0

Quindi, al fine di applicare l'inserto in un LinearLayout ho bisogno di sottoclasse nel modo giusto? – lupsyn