¿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 el WindowInsets . Si alguien puede explicar lo que son entonces sería una gran ayuda. Gracias.

2 Solutions collect form web for “¿Qué son WindowInsets?”

Puede aprender todo acerca de WindowInsets aquí. WindowInsets proporciona el área en la ventana que es utilizable por la aplicación. Por sí mismo es de poco uso. Es el propósito verdadero viene cuando usted o invalida View.onApplyWindowInsets o implementa View.OnApplyWindowInsetsListener . Puede leer sobre ellos aquí: View.onApplyWindowInsets y View.OnApplyWindowInsetsListener

Listener para aplicar inserciones de ventana en una vista de una manera personalizada.

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

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

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

Sería fácil de entender con ejemplos concretos. Imagen de este escenario:

Introduzca aquí la descripción de la imagen

Ahora, no desea que WindowInsets se aplique al ImageView fondo, ya que en ese caso el ImageView se rellena con la altura de la barra de estado.

Pero sí desea que los recuadros se apliquen a la Toolbar de Toolbar , porque de lo contrario la Toolbar se dibujaría en algún lugar de la barra de estado intermedia.

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

 android:fitsSystemWindows="true" 

En este ejemplo, no puede aplicar WindowInsets al diseño raíz, ya que el diseño raíz consume WindowInsets y el ImageView se rellenará.

En su lugar puede utilizar 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 esta devolución de llamada se llamará, cuando el diseño raíz de la Toolbar de Toolbar pasa WindowsInsets a sus hijos. Layouts como FrameLayout , LinearLayout no, DrawerLayout , CoordinatorLayout hacer.

Puede subclasificar su diseño, por ejemplo, FrameLayout y reemplazar 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 bonita entrada en el blog de Ian Lake sobre este tema.

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

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.