マルチウィンドウモードになっているかどうか、また画面のどの部分であるかを把握する代わりに、ナビゲーションビューのヘッダーをシステムウィンドウのインセットにする必要があります。
通常、1つのウィンドウが気になります。アプリケーションが描画されます。通常、ウィンドウはありません。あなたのアプリは全画面表示されていませんか?まあ、実際にはない。通常、上部にステータスバー、下部にナビゲーションバーなど、システムバー用に予約されたスペースがあります。それらは別々のウィンドウ、つまりシステムウィンドウに表示されます。 (ああ、今ではNでマルチウィンドウモードになっています。マルチアプリケーションウィンドウモードと同じように、システムウィンドウを数えればマルチウィンドウはしばらくあります)
ナビゲーションビューヘッダーは、システムウィンドウ(この場合はステータスバー)の下にあるかどうかに応じて、わずかな簡単な調整だけで、そのインセットを調整します。
ナビゲーションビューと仮定すると、そのように定義されています
<android.support.design.widget.NavigationView
...
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
... />
とシンプルなヘッダーレイアウトがnav_header_main.xml
にあります:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height"
android:background="@drawable/nav_header_background"
android:orientation="vertical"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="32dp">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/default_profile_picture" />
...
</LinearLayout>
あなたはちょうどそのようにそれを変更する必要があります。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height"
android:background="@drawable/nav_header_background"
android:fitsSystemWindows="true"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/sym_def_app_icon"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="8dp"/>
...
</LinearLayout>
- まず、レイアウトに
android:fitsSystemWindows="true"
を追加します。
fitsSystemWindows
は自動的にステータスバーのサイズに埋め込みを追加するので、上部の埋め込みを小さくする必要があります。以前は上部のパディングがヘッダーの上部から行われていましたが、ステータスバーの下部からしか表示されません。
- そして、
fitsSystemWindows
はそれらのパディングを上書きするため、レイアウトからすべてのパディングを別の場所に移動する必要があります(たとえば、子ビューのマージンに移動したなど)。
アプリがマルチウィンドウ分割の下部にある場合、ステータスバーの埋め込みは追加されません。また、ステータスバーの下にない場合や、Androidの将来のバージョンやクレイジーカスタムROMのステータスバーのサイズが変更された場合でも、ナビゲーションビューは適切に表示されます。
私はandroid:fitsSystemWindows = "true"はNavigationViewで十分だと思いました。アンドロイドを追加する:ヘッダーレイアウトにもfitsSystemWindowsが問題を修正します。おかげで – br00
私はちょうどこのソリューションは、API 24 + – br00