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

时间:2016-08-25 14:11:53

标签: android android-navigationview android-statusbar android-7.0-nougat

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

enter image description here

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

enter image description here

不幸的是,在新的api 24中你有isInMultiWindowMode(),但是无法知道屏幕的哪个部分是你的应用。

2 个答案:

答案 0 :(得分:2)

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

通常你只关心一个窗口 - 你的应用程序所在的窗口。通常你甚至不认为有任何窗口。你的应用程序不是全屏绘制的吗?嗯,实际上没有。通常会为系统栏保留一些空间,例如顶部的状态栏和底部的导航栏。它们被绘制在单独的窗口 - 系统窗口中。 (哦,现在我们在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将覆盖这些填充。
  4. 如果您的应用程序位于多窗口拆分的底部,则不会添加状态栏的填充。它还可以使您的导航视图在任何其他不在状态栏下的情况下正常显示,或者状态栏在任何未来版本的Android或某些疯狂的自定义ROM中更改大小。

答案 1 :(得分:0)

对我来说什么都没有用,所以我最终走了这条路,完成了工作:

echo $var | sed -E 's/.*(SuSE_11_design_guides).*/\1/'

从技术上讲,插件仍然存在,但由于用于绘制它们的<android.support.design.widget.NavigationView ... app:insetForeground="@null"/> 资源现在为空,即logic is skipped in ScrimInsetsFrameLayout's onDraw method(这是NavigationView的父类)。

所以当其他所有方法都失败时,这是一条相当有效的路线。