使用fitsSystemWindows时,NavigationView没有灰色边框

时间:2016-04-15 14:36:05

标签: android material-design navigation-drawer

我使用Android Studio 2.0创建了一个新应用,我想让我的导航抽屉位于Toolbar下方。我知道Material Design规格说它应该高于Toolbar,但我的抽屉没有那么多条目,我希望看到谷歌提供的整洁的图标动画。

我将DrawerLayout置于顶级CoordinatorLayout内,以获得我想要的内容。

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.company.app.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:openDrawer="start">

        <include layout="@layout/content_main" />

        <android.support.design.widget.NavigationView
            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:menu="@menu/activity_main_drawer" />

    </android.support.v4.widget.DrawerLayout>

</android.support.design.widget.CoordinatorLayout>

我在顶层布局上使用android:fitsSystemWindow="true",因此我可以为状态栏着色。但是当我这样做时,导航抽屉确实有一个灰色的顶部边框。

enter image description here

当我按照Google指定的方式(在工具栏上方)使用它时,边框会很好但这样看起来很丑陋。有什么办法可以删除吗?

我尝试覆盖NavigationView.onInsetsChanged(Rect rect)并且能够将项目放在顶部但灰色边框仍然存在。

1 个答案:

答案 0 :(得分:11)

我也很头疼,试图弄清楚这一点并设法找到this,其中描述CoordinatorLayout如何将fitsSystemWindows传递给其孩子。我肯定认为这是一个错误,因为NavigationView已将其设置为false,但后来我读到了这个:

  

NavigationView为您处理状态栏的稀松布保护,确保您的NavigationView在API21 +设备上正确地与状态栏进行交互。

来自Android Developers Blog

。所以我不确定该怎么想。我想这可能是因为NavigationView从未打算以这种方式使用。

尽管如此,这是一个可以尝试解决灰色条问题的解决方案,但我还没弄清楚它是否会导致问题。如果是这样,请回复。

activity_main.xml

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_marginTop="100dp"
        android:fitsSystemWindows="false"/>

</android.support.design.widget.CoordinatorLayout>

MainActivity课程中:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        if (navigationView != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
            navigationView.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
                @Override
                public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
                    return insets;
                }
            });
        }
    }
}

应该得到你:

Screenshot