fitsystemwindows - android android fitssystemwindows
¿Qué hace exactamente fitsSystemWindows? (2)
Me
fitsSystemWindows
entender el concepto de
fitsSystemWindows
ya que, según la vista, hace cosas diferentes.
Según la documentación oficial es un
Atributo interno booleano para ajustar el diseño de la vista en función de las ventanas del sistema, como la barra de estado. Si es verdadero, ajusta el relleno de esta vista para dejar espacio para las ventanas del sistema .
Ahora, comprobando la clase
View.java
, puedo ver que cuando se establece en
true
, las inserciones de la ventana (barra de estado, barra de navegación ...) se aplican a los rellenos de vista, lo 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 un uso extensivo de esta bandera y aquí es donde surge la confusión.
En muchas fuentes,
fitsSystemWindows
se menciona como el indicador para establecer la vista detrás de las barras del sistema.
Mira
here
La documentación en
ViewCompat.java
para
setFitsSystemWindows
dice:
Establece si esta vista debe o no tener en cuenta 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 predeterminada de {@link View # fitSystemWindows (Rect)}. Vea ese método para más detalles .
De acuerdo con esto,
fitsSystemWindows
simplemente significa que se ejecutará la función
fitsSystemWindows()
?
Las nuevas clases de Material parecen usar esto para dibujar bajo la barra de estado.
Si miramos 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 exactamente de la manera opuesta a la documentación de
fitsSystemWindows
?
En los últimos casos, significa
dibujar detrás de las barras del sistema
.
Sin embargo, si desea que un
FrameLayout
dibuje detrás de la barra de estado, establecer el valor de
fitsSystemWindows
en true no funciona, ya que la implementación predeterminada hace lo que se documenta inicialmente.
Debe anularlo y agregar los mismos indicadores que las otras clases mencionadas.
¿Me estoy perdiendo de algo?
Las ventanas del sistema son las partes de la pantalla donde el sistema dibuja contenido no interactivo (en el caso de la barra de estado) o interactivo (en el caso de la barra de navegación).
La mayoría de las veces, su aplicación no necesitará dibujar debajo de la barra de estado o la barra de navegación, pero si lo hace: debe asegurarse de que los elementos interactivos (como los botones) no estén ocultos debajo de ellos. Eso es lo que le proporciona el comportamiento predeterminado de Android: el atributo fitsSystemWindows = "true": establece el relleno de la Vista para garantizar que el contenido no se superponga a las ventanas del sistema.
https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec
no se dibuja detrás de la barra del sistema, se estira detrás de la barra para teñirla con los mismos colores que tiene, pero las vistas que contiene se rellenan dentro de la barra de estado si eso tiene sentido