fitsSystemWindows
さまざまなことを行うビューに依存するという概念を理解するのに苦労しています。公式ドキュメントによると、それは
ステータスバーなどのシステムウィンドウに基づいてビューのレイアウトを調整するブール内部属性。trueの場合、このビューのパディングを調整して、システムウィンドウ用のスペースを残します。
これで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()
が実行されることを意味しますか?新しいMaterialクラスは、ステータスバーの下の描画にこれを使用するようです。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
orにも同じパターンが表示されAppBarLayout
ます。
これは、ドキュメントとまったく逆の方法で機能しませんfitsSystemWindows
か?最後のケースでは、システムバーの後ろにドローします。
ただし、FrameLayout
ステータスバーの背後にそれ自体を描画したい場合はfitsSystemWindows
、デフォルトの実装が最初に文書化されていることを実行するため、true に設定してもうまくいきません。それをオーバーライドして、他の言及されたクラスと同じフラグを追加する必要があります。何か不足していますか?
CoordinatorLayout
、ステータスバーの背後にペイントする必要があるかどうかを推測するためにそのフラグを使用すると書かれています。FrameLayout
たとえば、はそうではありません。