在Android N多窗口模式中删除导航视图顶部填充

br0*_*r00 5 android android-statusbar android-navigationview android-7.0-nougat

我想从Android N的多窗口模式中删除paddingTop/ marginTop导航视图.就像Gmail一样.如果您看到下面的图像,我说的是正常的填充,其大小等于导航视图开头的状态栏.

在此输入图像描述

所以基本上在多窗口模式下(见下图)我必须在我的应用程序位于屏幕的第二部分时删除该填充.

在此输入图像描述

不幸的是,你可以从新的api 24获得,isInMultiWindowMode()但是不可能知道你的应用程序在屏幕的哪个部分.

Mar*_*ski 2

您不需要尝试确定您是否处于多窗口模式以及屏幕的哪个部分,而是需要使导航视图标题尊重系统窗口插图。

通常您只关心一个窗口 - 您的应用程序在其中绘制的那个窗口。通常您甚至不认为有任何窗口。你的应用程序不是全屏绘制的吗?嗯,实际上没有。通常会为系统栏保留一些空间,例如顶部的状态栏和底部的导航栏。它们是在单独的窗口 - 系统窗口中绘制的。(哦,现在我们在 N 中有了多窗口模式。更像是多应用程序窗口模式,因为如果你算上系统窗口,那么多窗口已经存在了一段时间了。)

只需进行一些简单的调整,您就可以使导航视图标题根据其是否位于系统窗口(在本例中:状态栏)下方来调整其插图。

假设导航视图的定义如下:

<android.support.design.widget.NavigationView
    ...
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header_main"
    ... />
Run Code Online (Sandbox Code Playgroud)

并且有一个简单的标题布局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>
Run Code Online (Sandbox Code Playgroud)

你只需要像这样改变它:

<?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>
Run Code Online (Sandbox Code Playgroud)
  1. 首先,您需要添加android:fitsSystemWindows="true"到布局中。
  2. 现在您需要缩小顶部内边距,因为fitsSystemWindows会自动添加状态栏大小的内边距。所以以前你的顶部填充是从标题的顶部开始的,现在它只是从状态栏的底部开始。
  3. 而且您必须将所有填充从布局移到其他地方(例如,我将它们移动到子视图的边距),因为fitsSystemWindows会覆盖这些填充。

此后,如果您的应用程序位于多窗口拆分的底部,则不会添加状态栏的填充。它还将使您的导航视图在不在状态栏下方的任何其他情况下看起来正确,或者如果状态栏在任何未来版本的 Android 或某些疯狂的自定义 ROM 中更改大小。