¿Qué hace exactamente fitsSystemWindows?
Estoy luchando para entender el concepto de fitsSystemWindows
como dependiendo de la vista que hace cosas diferentes. Según la documentación oficial, es un
Booleano atributo interno para ajustar el diseño de vista basado en ventanas del sistema, como la barra de estado. Si es true, ajusta el relleno de esta vista para dejar espacio para las ventanas del sistema .
- Android Gridview - Linear layout_height que se ignora
- Cómo cambiar el color de la actual desplazamiento en ScrollView Android?
- Android: Ajustar los tamaños de forma programática según el tamaño de la pantalla
- Android studio AssertionError: No invocar waitForSmartMode desde dentro de la acción de lectura en modo mudo
- Gesto MultiSelect como la aplicación Google Fotos
Ahora, verificando la clase View.java
puedo ver que cuando se establece en true
, las inserciones de ventana (barra de estado, barra de navegación …) se aplican a los rellenos de vista, que funciona de acuerdo con la documentación citada anteriormente. Esta es la parte relevante del código:
private boolean fitSystemWindowsInt(Rect insets) { if ((mViewFlags & FITS_SYSTEM_WINDOWS) == FITS_SYSTEM_WINDOWS) { mUserPaddingStart = UNDEFINED_PADDING; mUserPaddingEnd = UNDEFINED_PADDING; Rect localInsets = sThreadLocal.get(); if (localInsets == null) { localInsets = new Rect(); sThreadLocal.set(localInsets); } boolean res = computeFitSystemWindows(insets, localInsets); mUserPaddingLeftInitial = localInsets.left; mUserPaddingRightInitial = localInsets.right; internalSetPadding(localInsets.left, localInsets.top, localInsets.right, localInsets.bottom); return res; } return false; }
Con el nuevo diseño de material hay nuevas clases que hacen uso extensivo de esta bandera y aquí es donde la confusión viene. En muchas fuentes fitsSystemWindows
se menciona como el indicador para establecer para establecer la vista detrás de las barras del sistema. Vea aquí .
La documentación en ViewCompat.java
para setFitsSystemWindows
dice:
Establece si esta vista debe tener en cuenta o no las decoraciones de la pantalla del sistema, como la barra de estado, e insertar su contenido; Es decir, controlar si se ejecutará la implementación por defecto de {@link View # fitSystemWindows (Rect)}. Vea ese método para más detalles .
De acuerdo con esto, fitsSystemWindows
simplemente significa que la función fitsSystemWindows()
se ejecutará? Las nuevas clases de material parecen usar esto para dibujar bajo la barra de estado. Si observamos el código de DrawerLayout.java
, podemos ver esto:
if (ViewCompat.getFitsSystemWindows(this)) { IMPL.configureApplyInsets(this); mStatusBarBackground = IMPL.getDefaultStatusBarBackground(context); }
…
public static void configureApplyInsets(View drawerLayout) { if (drawerLayout instanceof DrawerLayoutImpl) { drawerLayout.setOnApplyWindowInsetsListener(new InsetsListener()); drawerLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } }
Y vemos el mismo patrón en el nuevo CoordinatorLayout
o AppBarLayout
.
¿No funciona esto de la manera exactamente opuesta como la documentación para fitsSystemWindows
? En los últimos casos, significa dibujar detrás de las barras del sistema .
Sin embargo, si desea que FrameLayout
dibuje detrás de la barra de estado, establecer fitsSystemWindows
como true no hace el truco ya que la implementación predeterminada hace lo que se documenta inicialmente. Tienes que anularlo y agregar los mismos indicadores que las otras clases mencionadas. ¿Me estoy perdiendo de algo?
- Android Diseño principios de diseño
- Que constructor a ser llamado para ver?
- ButterKnife no trabaja con Jack?
- El ajuste de texto en varios EditTexts inflados hace que todos se rellenen con el mismo texto después de la rotación
- GridLayout (no GridView) cómo estirar todos los niños uniformemente
- Alinear texto a la izquierda, marcar la casilla a la derecha
- Detección del tamaño de un dedo de usuario en el toque
- Obtener Posición de Vista Absoluta en ListView
No se dibuja detrás de la barra del sistema que tipo de se extiende detrás de la barra para teñir con los mismos colores que tiene, pero las vistas que contiene se rellena dentro de la barra de estado si eso tiene sentido
Las ventanas del sistema son las partes de la pantalla en las que el sistema dibuja no interactivo (en el caso de la barra de estado) o interactivo (en el caso de la barra de navegación) de contenido.
La mayoría de las veces, su aplicación no necesitará dibujar debajo de la barra de estado o de la barra de navegación, pero si lo hace: debe asegurarse de que los elementos interactivos (como los botones) no se oculten debajo de ellos. Eso es lo que te da el comportamiento predeterminado del atributo android: fitsSystemWindows = "true": establece el relleno de la Vista para asegurar que el contenido no se superponga a las ventanas del sistema.
https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec
- ¿Cómo puedo evitar los retrasos de recolección de basura en juegos Java? (Mejores Prácticas)
- Cambiar el color del cursor edittext