Staram się zrozumieć koncepcję, że fitsSystemWindows
w zależności od poglądu robi różne rzeczy. Zgodnie z oficjalną dokumentacją jest to plik
Wewnętrzny atrybut logiczny, aby dostosować układ widoku na podstawie okien systemowych, takich jak pasek stanu. Jeśli tak, dostosowuje wypełnienie tego widoku, aby zostawić miejsce na okna systemowe .
Teraz, sprawdzając View.java
klasę, widzę, że gdy jest ustawiona na true
, wstawki okna (pasek stanu, pasek nawigacji ...) są stosowane do paddings widoku, co działa zgodnie z cytowaną powyżej dokumentacją. To jest odpowiednia część kodu:
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;
}
Wraz z nowym Material Design pojawiły się nowe klasy, które w szerokim zakresie wykorzystują tę flagę i tutaj pojawia się zamieszanie. W wielu źródłach fitsSystemWindows
jest wymieniany jako flaga ustawiana, aby umieścić widok za kratkami systemu. Zobacz tutaj .
Dokumentacja ViewCompat.java
za setFitsSystemWindows
mówi:
Określa, czy ten widok powinien uwzględniać dekoracje ekranu systemu, takie jak pasek stanu, i wstawiać jego zawartość; to znaczy kontrolowanie, czy zostanie wykonana domyślna implementacja {@link View # fitSystemWindows (Rect)}. Zobacz tę metodę, aby uzyskać więcej informacji .
Zgodnie z tym, fitsSystemWindows
po prostu oznacza, że funkcja fitsSystemWindows()
zostanie wykonana? Wydaje się, że nowe klasy materiałów używają tego po prostu do rysowania pod paskiem stanu. Jeśli spojrzymy na DrawerLayout.java
kod, zobaczymy to:
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);
}
}
I widzimy ten sam wzór w nowym CoordinatorLayout
lub AppBarLayout
.
Czy to nie działa w dokładnie odwrotny sposób niż dokumentacja fitsSystemWindows
? W ostatnich przypadkach oznacza to rysowanie za kratkami systemu .
Jeśli jednak chcesz, aby a FrameLayout
rysował się za paskiem stanu, ustawienie fitsSystemWindows
na true nie załatwia sprawy, ponieważ domyślna implementacja robi to, co zostało początkowo udokumentowane. Musisz go nadpisać i dodać te same flagi, co inne wspomniane klasy. Czy coś mi brakuje?
CoordinatorLayout
, używają tej flagi do wywnioskowania, czy powinny malować za paskiem stanu, czy nie. Na FrameLayout
przykład tak nie jest.