java android android-layout android-view windowinsets

java - ¿Qué son los WindowInsets?



android android-layout (2)

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


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

Escucha para aplicar inserciones 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 inserciones de ventana para una vista. Si se establece un OnApplyWindowInsetsListener, se llamará a su método onApplyWindowInsets en lugar del método onApplyWindowInsets de View. El oyente puede llamar opcionalmente al método onApplyWindowInsets de View para aplicar el comportamiento normal de View como parte del 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 (por ejemplo, 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:

Ahora, no desea que WindowInsets se aplique a ImageView fondo, porque en ese caso, ImageView estaría rellenado por la altura de la barra de estado.

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

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

android:fitsSystemWindows="true"

En este ejemplo, no puede aplicar WindowInsets al diseño raíz, porque el diseño raíz consumiría WindowInsets y el ImageView estaría relleno.

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 esta devolución de llamada se llamaría cuando el diseño raíz de la Toolbar de Toolbar pase WindowsInsets a sus elementos WindowsInsets . Los diseños como FrameLayout , LinearLayout no, DrawerLayout , CoordinatorLayout sí.

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 de blog en medio de Ian Lake sobre estas cosas, también la presentación de "Convertirse en un instalador de ventanas maestro" por Chris Banes.

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

Más recursos: