导航抽屉的NavigationView上仍然存在重叠的阴影效果

hat*_*ata 12 android android-fullscreen navigation-drawer android-navigationview

我已经改进了Android Studio的Navigation Drawer Activity项目模板,该模板使用Toolbar,v7.app.ActionBarDrawerToggleNavigationView而不是NavigationDrawerFragment(以及layout/fragment_navigation_drawer.xml).

导航抽屉在抽屉关闭时呈浸入式粘性

它完美地工作.然后,我走得更远.我的导航抽屉项目处于沉浸式粘性(全屏)模式.

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    if (hasFocus) {
        View decorationView = getWindow().getDecorView();
        decorationView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {

    ...

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    ActionBar actionBar = getSupportActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);

    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerToggle = new ActionBarDrawerToggle(
            this,
            drawerLayout,
            R.string.navigation_drawer_open,  /* "open drawer" description for accessibility */
            R.string.navigation_drawer_close  /* "close drawer" description for accessibility */
    ) {
        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);

            invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);

            invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
        }
    };
    drawerLayout.setDrawerListener(drawerToggle);

    navigationView = (NavigationView) findViewById(R.id.navigation_view);
    navigationView.setNavigationItemSelectedListener(this);
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    drawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    drawerToggle.onConfigurationChanged(newConfig);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (drawerToggle.onOptionsItemSelected(item)) {
        return true;
    }

    ...

}
Run Code Online (Sandbox Code Playgroud)

问题已经出现.从状态栏(在顶部)和导航栏(在底部)导出的NavigationView上的重叠阴影效果的波段保持静止.

导航抽屉打开时

打开导航抽屉时,会显示粘滞状态和导航栏

我怎么能摆脱他们?

我查看了Android的v7.app.ActionBarDrawerToggle或NavigationView的来源,但是徒劳无功.


更新:

感谢@ lcw_gg的建议,我完全摆脱了状态栏的阴影(导航栏的阴影仍然存在).那就是在布局xml中设置android:windowFullscreen属性true.

但是我想用Java代码做这件事.我找到了一种方法,可能它等同于xml方式:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
Run Code Online (Sandbox Code Playgroud)

通过这样做,你不再需要设置这两个标志 - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREENView.SYSTEM_UI_FLAG_FULLSCREEN- decorationView.

状态栏的阴影已消失,而导航栏的阴影仍然存在

不过,我找不到摆脱导航栏阴影的方法.我在等待解决方案.

hat*_*ata 19

最后,我做到了.

该溶液是用FLAG_LAYOUT_NO_LIMITS与共同FLAG_FULLSCREENandroid.view.Window对象.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
        | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
Run Code Online (Sandbox Code Playgroud)

这完全摆脱了两个阴影.

在此输入图像描述

lcw_gg的评论是非常有用的操纵线索android.view.Window.特别感谢他.


All*_*oso 6

接受答案有问题。设置标志FLAG_FULL_SCREENFLAG_LAYOUT_NO_LIMITS将使窗口的插入量为0,并且内容可能位于系统UI的后面。

之所以会起作用NavigationView,是因为当窗口插入全部为0时,它是的子类ScrimInsetsFrameLayout,并且侦听onApplyWindowInsetsView.setWillNotDraw为true。

您只需要添加NavigationView以下内容:

app:insetForeground="@null"
Run Code Online (Sandbox Code Playgroud)