5

Android NのマルチウィンドウモードのナビゲーションビューからpaddingTop/marginTopを削除します.Gmailは既にそうです。 下の画像が表示されている場合、ナビゲーションビューの先頭にあるステータスバーと同じサイズの通常のパディングが使用されています。マルチウィンドウモードでのしたがって、基本的Android Nマルチウィンドウモードでナビゲーションビューのトップパディングを削除する

enter image description here

(下の画像を参照してください)私は私のアプリは、画面の第二部にあるときにパディングを削除する必要があります。

enter image description here

残念ながら、新しいAPI 24から、あなたはisInMultiWindowMode()を持っているが、それは、画面の一部があなたのアプリケーションである知っていることはできません。

答えて

2

マルチウィンドウモードになっているかどうか、また画面のどの部分であるかを把握する代わりに、ナビゲーションビューのヘッダーをシステムウィンドウのインセットにする必要があります。

通常、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> 
  1. まず、レイアウトにandroid:fitsSystemWindows="true"を追加します。
  2. fitsSystemWindowsは自動的にステータスバーのサイズに埋め込みを追加するので、上部の埋め込みを小さくする必要があります。以前は上部のパディングがヘッダーの上部から行われていましたが、ステータスバーの下部からしか表示されません。
  3. そして、fitsSystemWindowsはそれらのパディングを上書きするため、レイアウトからすべてのパディングを別の場所に移動する必要があります(たとえば、子ビューのマージンに移動したなど)。

アプリがマルチウィンドウ分割の下部にある場合、ステータスバーの埋め込みは追加されません。また、ステータスバーの下にない場合や、Androidの将来のバージョンやクレイジーカスタムROMのステータスバーのサイズが変更された場合でも、ナビゲーションビューは適切に表示されます。

+0

私はandroid:fitsSystemWindows = "true"はNavigationViewで十分だと思いました。アンドロイドを追加する:ヘッダーレイアウトにもfitsSystemWindowsが問題を修正します。おかげで – br00

+0

私はちょうどこのソリューションは、API 24 + – br00

0

私にとっては何も私はこのルートを行くことになったし、それが仕事を得た働いていなかった。

<android.support.design.widget.NavigationView 
    ... 
    app:insetForeground="@null"/> 

技術的には、インセットがまだ存在しているが、それらの上に描画するために使用insetForegroundリソースが現在nullであるため、 、そのlogic is skipped in ScrimInsetsFrameLayout's onDraw method(これはNavigationViewの親クラスです)。

他のすべてが失敗した場合、これはかなり効率的なルートです。

関連する問題