Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android N多窗口模式下删除导航视图顶部填充_Android_Android Navigationview_Android Statusbar_Android 7.0 Nougat - Fatal编程技术网

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

在Android N多窗口模式下删除导航视图顶部填充,android,android-navigationview,android-statusbar,android-7.0-nougat,Android,Android Navigationview,Android Statusbar,Android 7.0 Nougat,我想在Android N的多窗口模式下从导航视图中删除paddingTop/marginTop。就像Gmail已经做的那样。 如果您看到下图,我指的是正常的填充,其大小等于导航视图开头的状态栏 因此,基本上在多窗口模式下(见下图),当我的应用程序位于屏幕的第二部分时,我必须删除填充 不幸的是,在新的api 24中,您有isInMultiWindowMode(),但不可能知道屏幕的哪个部分是您的应用程序。您需要让导航视图标题与系统窗口的插入相对应,而不是试图确定您是否处于多窗口模式以及屏幕的哪

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

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


不幸的是,在新的api 24中,您有
isInMultiWindowMode()
,但不可能知道屏幕的哪个部分是您的应用程序。

您需要让导航视图标题与系统窗口的插入相对应,而不是试图确定您是否处于多窗口模式以及屏幕的哪个部分

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

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

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

<android.support.design.widget.NavigationView
    ...
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header_main"
    ... />
<?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.support.design.widget.NavigationView
    ...
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header_main"
    ... />
<?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:fitsystemwindows=“true”
    添加到布局中
  • 现在您需要减小顶部填充,因为
    fitsystemwindows
    将自动添加状态栏大小的填充。因此,以前您的顶部填充是从标题的顶部开始的,现在它仅从状态栏的底部开始
  • 您必须将所有填充从布局中移到其他位置(例如,我将它们移到了子视图的页边距),因为
    fitsystemwindows
    将覆盖这些填充

  • 在此之后,如果您的应用程序位于多窗口拆分的底部,则不会添加状态栏的填充。它还将使您的导航视图在任何其他情况下都能正常显示,这些情况下,导航视图不在状态栏下,或者在任何未来版本的Android或一些疯狂的自定义ROM中,状态栏的大小会发生变化。

    对我来说,一切都不起作用,所以我选择了这条路线,它完成了任务:

    <android.support.design.widget.NavigationView
        ...
        app:insetForeground="@null"/>
    
    (导航视图的父类)


    因此,当所有其他方法都失败时,这是一个相当有效的方法。

    我认为导航视图中的android:fitsystemwindows=“true”就足够了。在页眉布局中添加android:fitsSystemWindows也可以解决此问题。谢谢,我刚刚发现这个解决方案只适用于api 24+