固定状态栏和隐藏的导航栏

时间:2018-07-09 10:35:22

标签: android android-layout statusbar

是否可以隐藏导航栏而不隐藏状态栏?

我已经在样式的xml中尝试过

  <item name="android:windowFullscreen">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>

我在活动中隐藏了这样的导航栏

  val decorView = window.decorView
        val uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        decorView.systemUiVisibility = uiOptions

谢谢!

编辑:

   fun hideNavigationStatusBar(activity: Activity) {
        activity.window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
        val decorView = activity.window.decorView
        val uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        decorView.systemUiVisibility = uiOptions
    }

    fun translucidNavigationBar(activity: Activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            val w = activity.window
            w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
        }
    }

我可以用第一种方法隐藏状态和导航栏,用第二种方法隐藏状态的导航,但是仍然无法保持状态并完全隐藏导航栏。

2 个答案:

答案 0 :(得分:1)

您可以使用此方法:

private void setTransparentStatusBar(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
    } else {
        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }
}

答案 1 :(得分:1)

解决此问题的最简单方法是分两部分:删除导航栏,然后使状态栏透明。

1-删除导航栏

要删除导航栏,请在从Theme.AppCompat.Light.NoActionBar继承的values文件夹下的styles.xml文件上创建新样式。

https://i.stack.imgur.com/UdMLQ.png

然后在manifest.xml文件中,将“活动”的主题更改为您的自定义样式。

Edited manifest

这样,导航栏将被删除,但状态栏仍将显示为灰色。

2-使状态栏透明

您可以按照本教程将状态栏设为透明:Transparent Status Bar

或仅将以下内容添加到“活动”的onCreate方法中:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window w = getWindow();
w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, 
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}

enter image description here

有了这个,您可以期待一种类似于下一张图片的应用风格:

enter image description here

3-完全删除状态栏

要完全隐藏状态栏,请将其添加到onCreate方法中:

View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);

您可以在Hiding the status bar

上了解更多信息

结果:

enter image description here

4-删除导航栏

您可以在Android开发者网站Hiding the navigation bar

上找到解决方案

基本上只是将其添加到您的onCreate中:

View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);