Que fait fitSystemWindows exactement?

J’ai du mal à comprendre le concept de fitsSystemWindows car en fonction de la vue, il fait des choses différentes. Selon la documentation officielle, c’est un

Atsortingbut booléen interne pour ajuster la disposition de la vue en fonction des fenêtres système telles que la barre d’état. Si la valeur est true, ajuste le remplissage de cette vue pour laisser de la place aux fenêtres du système .

Maintenant, en vérifiant la classe View.java , je peux voir que si elle est définie sur true , les encarts de la fenêtre (barre d’état, barre de navigation …) sont appliqués aux bourrages de la vue, conformément à la documentation citée ci-dessus. Ceci est 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 la nouvelle conception matérielle, il y a de nouvelles classes qui utilisent largement ce drapeau et c’est là que vient la confusion. Dans de nombreuses sources, fitsSystemWindows est mentionné comme indicateur à définir pour placer la vue derrière les barres système. Voir ici

La documentation de ViewCompat.java pour setFitsSystemWindows dit:

Définit si cette vue doit ou non tenir compte des décorations d’écran du système telles que la barre d’état et insérer son contenu; c’est-à-dire 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 .

En conséquence, fitsSystemWindows signifie simplement que la fonction fitsSystemWindows() sera exécutée? Les nouvelles classes de matériau semblent simplement utiliser ceci pour dessiner sous la barre d’état. Si nous regardons le code de DrawerLayout.java , 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 de la même manière que la documentation de fitsSystemWindows ? Dans les derniers cas, cela signifie dessiner derrière les barres système .

Toutefois, si vous souhaitez qu’un FrameLayout se dessine derrière la barre d’état, la définition de fitsSystemWindows sur true ne fait pas l’affaire, car l’implémentation par défaut effectue ce qui est documenté initialement. Vous devez le remplacer et append les mêmes indicateurs que les autres classes mentionnées. Est-ce que je manque quelque chose?

Les fenêtres système sont les parties de l’écran sur lesquelles le système dessine, non interactif (dans le cas de la barre d’état) ou interactif (dans le cas de la barre de navigation).

La plupart du temps, votre application n’aura pas besoin de dessiner sous la barre d’état ou la barre de navigation, mais si vous le faites: vous devez vous assurer que les éléments interactifs (comme les boutons) ne sont pas cachés en dessous. C’est ce que vous offre le comportement par défaut de l’atsortingbut android: fitsSystemWindows = «true»: il définit le remplissage de la vue pour garantir que le contenu ne superpose pas les fenêtres du système.

https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec

il ne dessine pas derrière la barre du système, il s’étend en quelque sorte derrière la barre pour le colorer avec les mêmes couleurs, mais les vues qu’il contient sont complétées à l’intérieur de la barre d’état si cela est logique