¿Qué son WindowInsets?

Estoy tratando de aprender sobre el sistema operativo Android y mientras estaba leyendo la aplicación Google I / O 2014, me encontré con WindowInsets . Si alguien puede explicar lo que son, sería una gran ayuda. Gracias.

Puedes aprender todo sobre WindowInsets aquí. WindowInsets proporciona el área en la ventana que puede usar la aplicación. Por sí solo no sirve de mucho. Su verdadero propósito se produce cuando anulas View.onApplyWindowInsets o implementa View.OnApplyWindowInsetsListener . Puede leer sobre ellos aquí: View.onApplyWindowInsets y View.OnApplyWindowInsetsListener

Oyente para aplicar recuadros de ventana en una vista de forma personalizada.

Las aplicaciones pueden optar por implementar esta interfaz si desean aplicar una política personalizada a la forma en que se tratan las ventanas insertadas para una vista. Si se establece un OnApplyWindowInsetsListener, se llamará a su método onApplyWindowInsets en lugar del propio método ViewApplyWindowInsets de la vista. El oyente puede llamar opcionalmente al método View’s onApplyWindowInsets para aplicar el comportamiento normal de View como propio.

En resumen, anular esto le permitirá controlar el área de la ventana disponible para su Vista.

WindowInsets son inserciones (o tamaños) de vistas del sistema (p. Ej., Barra de estado, barra de navegación) que se aplican a la ventana.

Sería fácil de entender en un ejemplo concreto. Imagen de este escenario:

enter image description here

Ahora, no desea que WindowInsets se aplique al fondo ImageView , porque en ese caso el ImageView se rellenaría con la altura de la barra de estado.

Pero sí quieres que se apliquen Toolbar a la Toolbar de Toolbar , ya que de lo contrario la Toolbar se dibujaría en algún lugar en la barra de estado intermedia.

La vista declara el deseo de aplicar WindowInsets en xml diciendo:

 android:fitsSystemWindows="true" 

En este ejemplo, no puede aplicar WindowInsets al WindowInsets de la raíz, ya que el diseño de la raíz consumiría WindowInsets , y ImageView se rellenaría.

En su lugar, puede usar ViewCompat.setOnApplyWindowInsetsListener para aplicar inserciones a la barra de herramientas:

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

Tenga en cuenta que se llamaría a esta callback, cuando el diseño raíz de la Toolbar de Toolbar WindowsInsets a sus elementos WindowsInsets . Los diseños como FrameLayout , LinearLayout no, DrawerLayout , CoordinatorLayout do.

Puede subclasificar su diseño, por ejemplo, FrameLayout y anular 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; } 

Hay una buena publicación en el blog en el medio de Ian Lake sobre este tema, también la presentación de "Convertirse en un instalador maestro de ventanas" de Chris Banes.

También creé un artículo detallado en Medium sobre WindowInset s.

Más recursos:

  • Windows Insets + Fragment Transitions por Chris Banes