在Android N多窗口模式下删除导航视图顶部填充
我想在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(),但不可能知道屏幕的哪个部分是您的应用程序。您需要让导航视图标题与系统窗口的插入相对应,而不是试图确定您是否处于多窗口模式以及屏幕的哪
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+