Я намагаюся зрозуміти поняття fitsSystemWindows
як залежне від погляду, воно робить різні речі. Згідно з офіційною документацією, це
Буловий внутрішній атрибут для налаштування макета перегляду на основі системних вікон, таких як рядок стану. Якщо це правда, коригує прокладку цього виду, щоб залишати місце для вікон системи .
Тепер, перевіряючи View.java
клас, я можу побачити, що при встановленні до true
вкладок перегляду застосовуються вставки вікон (рядок стану, панель навігації ...), що працює відповідно до цитованої вище документації. Це відповідна частина коду:
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;
}
З новим дизайном матеріалу з'являються нові класи, які широко використовують цей прапор, і саме тут виникає плутанина. У багатьох джерелах fitsSystemWindows
згадується як прапор, який потрібно встановити, щоб закласти вигляд за панелями системи. Дивіться тут .
Документація в ViewCompat.java
для setFitsSystemWindows
:
Встановлює, чи повинен цей вигляд враховувати прикраси екрана системи, такі як рядок стану, та вставляти його вміст; тобто контролює, чи буде виконана реалізація за замовчуванням {@link View # fitSystemWindows (Rect)}. Детальніше див. У цьому методі .
Згідно з цим, fitsSystemWindows
просто означає, що функція fitsSystemWindows()
буде виконуватися? Нові класи Матеріал, як видається, просто використовують це для малювання під рядком стану. Якщо ми подивимось на DrawerLayout.java
код коду, ми можемо побачити таке:
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);
}
}
І той самий зразок ми бачимо в новому CoordinatorLayout
або AppBarLayout
.
Чи не працює це прямо протилежним чином, як документація fitsSystemWindows
? В останніх випадках це означає тягнути за системними гратами .
Однак, якщо ви хочете, FrameLayout
щоб намалювати себе за рядком стану, встановлення fitsSystemWindows
значення true не робитиме хитрощів, оскільки реалізація за замовчуванням робить те, що було задокументовано спочатку. Ви повинні її замінити та додати ті самі прапори, що й інші згадані класи. Я щось пропускаю?
CoordinatorLayout
, використовують цей прапор, щоб зробити висновок про те, чи слід фарбувати їх за рядком стану чи ні. Це не той випадок з FrameLayout
, наприклад.