【问题标题】:Fixed Status bar and hidden Navigation bar固定状态栏和隐藏导航栏
【发布时间】:2018-07-09 10:35:21
【问题描述】:

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

我已经在我的样式的 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)
        }
    }

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

【问题讨论】:

  • 请参考link
  • 我想在不使用库的情况下解决它,谢谢。

标签: android android-layout statusbar


【解决方案1】:

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

1 - 移除导航栏

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

然后在 manifest.xml 文件中将 Activity 的主题更改为您的自定义样式。

这样导航栏将被移除,但状态栏仍将变灰。

2 - 使状态栏透明

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

或者只需将以下内容添加到您的 Activity 的 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);
}

有了这个,你可以期待一个类似于下图中的应用风格:

3 - 完全移除状态栏

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

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

您可以在Hiding the status bar阅读更多内容

结果:

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);

【讨论】:

  • 非常感谢,但是有什么办法可以完全隐藏导航栏?
  • 当我进入屏幕时导航栏是隐藏的,但是当我触摸它的任何部分时,导航栏又出现了。
  • 嗨 arkandas 我想你写了几乎所有的选项 xD,但再次是否可以保持状态并隐藏导航栏?在我触摸屏幕之前,您的第二个选项导航栏是隐藏的。无论如何,非常感谢!
  • 抱歉,我想我并没有完全理解您想要实现的目标。您能否上传一张反映您希望获得的最终结果的图片?
【解决方案2】:

你可以用这个方法:

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);
    }
}

【讨论】:

  • 这使我的导航栏半透明,但状态栏仍然隐藏
  • 此方法不会隐藏状态栏,请删除代码中隐藏的部分。我相信是这个:View.SYSTEM_UI_FLAG_FULLSCREEN
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多