如何防止导航栏留下黑条? (沉浸式模式)

时间:2015-02-24 18:19:18

标签: android android-activity

使用沉浸式模式的应用会在等待一段时间(活动被销毁)后返回应用时在屏幕底部留下黑条。

发生了什么:(我启用了开发人员选项:“不要保留活动”来重现这一点)。

  1. 首次推出该应用。沉浸式模式按预期工作。

  2. 向上滑动以显示“沉浸式粘性”导航栏,然后使用“主页”按钮离开应用。在应用关闭之前,导航栏的背景会短暂显示黑色背景。

  3. 使用“最近”按钮,然后选择要恢复的应用。

  4. 该应用程序打开以在黑条上短暂显示导航栏。系统ui折叠成沉浸式模式,但黑色条仍然存在。 systemuiblackbar

  5. 此错误也只出现在Lollipop上,而不是KitKat上。

    除了设置系统UI标志之外,我已经删除了应用程序以简单地启动虚拟活动而没有任何功能:

    public class DummyActivity extends FragmentActivity {
    
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
            setSystemUiVisibility();
        }
    }
    
    public void setSystemUiVisibility() {
        if (getWindow() != null && getWindow().getDecorView() != null) {
            getWindow().getDecorView().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);
            }
        }
    }
    

    编辑: 在创建一个只有这个Activity的新的新项目后,我在使用扩展“android:Theme.Holo”的应用主题时再次看到了这个问题...并在我扩展Material主题时解决了这个示例项目中的问题:< / p>

    更改

    <style name="AppTheme" parent="android:Theme.Holo.Light.NoActionBar.Fullscreen">
    </style>
    

    <style name="AppTheme"parent="android:Theme.Material.Light.NoActionBar.Fullscreen">
    </style>
    

    不幸的是,这个修复程序并没有解决我的主项目中的问题,但它让我更接近解决方案,并可能帮助其他人解决同样的问题。

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。以下是我所做的一些更新,让它消失了。希望其中一个适合你!

activity_main.xml中

android:fitsSystemWindows="false"

式-V21

<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowSharedElementsUseOverlay">false</item>

MainActivity.java

getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
    );

答案 1 :(得分:1)

使用

<style name="AppTheme"parent="android:Theme.Material.Light.NoActionBar.Fullscreen"> </style>

确实解决了这个问题,但它只适用于api:21。

为了使其适用于所有系统。您可以在res目录中创建名为style-v21的目录,并将该style.xml放在那里。 Android系统非常智能,可以选择用于新手机或旧手机的手机。

答案 2 :(得分:0)

对我来说,顶部是一个黑色的条。关键是活动风格:

// Important to draw behind cutouts
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> 

这是我的代码:

1-活动中

private fun hideSystemUI() {
    sysUIHidden = true
    // Enables regular immersive mode.
    // For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
    // Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
    window.decorView.systemUiVisibility = (
            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            or View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
            // Hide the nav bar and status bar
            or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // Hide nav bar
            or View.SYSTEM_UI_FLAG_FULLSCREEN // Hide status bar
            )
}


private fun showSystemUI() {
    sysUIHidden = false
    window.decorView.systemUiVisibility = (
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            // Set the content to appear under the system bars so that the
            // content doesn't resize when the system bars hide and show.
            or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION // layout Behind nav bar
            or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN // layout Behind status bar
            )
}

2-在xml布局的根视图中

android:fitsSystemWindows="false"

3-全屏活动的样式:

<style name="FullscreenTheme" parent="AppTheme">
    <item name="android:actionBarStyle">@style/FullscreenActionBarStyle</item>
    <item name="android:windowActionBarOverlay">true</item>
    <item name="android:windowBackground">@null</item>
    <item name="metaButtonBarStyle">?android:attr/buttonBarStyle</item>
    <item name="metaButtonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
    <item name="android:statusBarColor">#50000000</item>
    <item name="android:navigationBarColor">#50000000</item>
    // Important to draw behind cutouts
    <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> 
</style>

<style name="FullscreenActionBarStyle" parent="Widget.AppCompat.ActionBar">
    <item name="android:background">@color/sysTransparent</item>
</style>