J'ai du mal à comprendre le concept de fitsSystemWindows
comme dépendant de la vue, il fait des choses différentes. Selon la documentation officielle, c'est un
Attribut interne booléen permettant d'ajuster la disposition de la vue en fonction des fenêtres système telles que la barre d'état. Si c'est vrai, ajuste le remplissage de cette vue pour laisser de l'espace pour les fenêtres système .
Maintenant, en vérifiant la View.java
classe, je peux voir que lorsqu'elle est définie sur true
, les encarts de fenêtre (barre d'état, barre de navigation ...) sont appliqués aux paddings de vue, ce qui fonctionne selon la documentation citée ci-dessus. Voici la partie pertinente du code:
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;
}
Avec le nouveau design Material, de nouvelles classes utilisent largement ce drapeau et c'est là que vient la confusion. Dans de nombreuses sources, il fitsSystemWindows
est mentionné comme indicateur à définir pour placer la vue derrière les barres du système. Regardez ici .
La documentation de ViewCompat.java
pour setFitsSystemWindows
dit:
Définit si cette vue doit ou non prendre en compte les décorations d'écran du système telles que la barre d'état et insérer son contenu; autrement dit, contrôler si l'implémentation par défaut de {@link View # fitSystemWindows (Rect)} sera exécutée. Voir cette méthode pour plus de détails .
Selon cela, fitsSystemWindows
signifie simplement que la fonction fitsSystemWindows()
sera exécutée? Les nouvelles classes de matériaux semblent l'utiliser uniquement pour dessiner sous la barre d'état. Si nous regardons DrawerLayout.java
le code de, nous pouvons voir ceci:
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);
}
}
Et nous voyons le même schéma dans le nouveau CoordinatorLayout
ou AppBarLayout
.
Cela ne fonctionne-t-il pas exactement à l'opposé de la documentation pour fitsSystemWindows
? Dans les derniers cas, cela signifie tirer derrière les barres du système .
Cependant, si vous voulez que un FrameLayout
se dessine derrière la barre d'état, la définition fitsSystemWindows
de true ne fait pas l'affaire car l'implémentation par défaut fait ce qui est documenté initialement. Vous devez le remplacer et ajouter les mêmes indicateurs que les autres classes mentionnées. Est-ce que je manque quelque chose?
CoordinatorLayout
, utilisent cet indicateur pour déduire s'ils doivent ou non peindre derrière la barre d'état. Ce n'est pas le cas FrameLayout
, par exemple.