固定状态栏与隐藏导航栏

5

能否在不隐藏状态栏的情况下隐藏导航栏?

我在我的样式 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

Thank you!!

Edit:

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

我可以通过第一种方法隐藏状态栏和导航栏,并通过第二种方法保留半透明的导航栏,但是我仍然无法同时保留状态栏并完全隐藏导航栏。


请参考此链接:https://stackoverflow.com/a/47977279/4748607 - Nirav Bhavsar
我想不使用库来解决它,谢谢。 - Pablo R.
2个回答

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

这会使我的导航栏半透明,但状态栏仍然被隐藏。 - Pablo R.
这个方法没有隐藏状态栏,请删除你代码中的那部分。我相信它是这个:View.SYSTEM_UI_FLAG_FULLSCREEN - HedeH

1
最简单的解决方法分为两步,先移除导航栏,然后将状态栏设为透明。
1- 移除导航栏
要移除导航栏,需要在values文件夹下的styles.xml文件中创建一个继承自Theme.AppCompat.Light.NoActionBar的新样式。

https://istack.dev59.com/UdMLQ.webp

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

Edited manifest

这样做会移除导航栏,但状态栏仍会变成灰色。

2 - 使状态栏透明

您可以按照此教程使状态栏透明:透明状态栏

或只需将以下内容添加到活动的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);

您可以在隐藏状态栏中了解更多相关内容。

结果:

enter image description here

4 - 移除导航栏

您可以在Android Developer网站上找到解决方案 隐藏导航栏

基本上只需将以下内容添加到您的onCreate中:

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

非常感谢,但有没有完全隐藏导航栏的方法? - Pablo R.
1
当我进入屏幕时,导航栏被隐藏了,但是当我触摸它的任何部分时,导航栏又会出现。 - Pablo R.
嗨,arkandas,我认为你几乎写了所有的选项xD,但是再问一下,是否可以保持状态并隐藏导航栏?使用您的第二个选项,导航栏在我触摸屏幕之前是隐藏的。无论如何,非常感谢!! - Pablo R.
抱歉,我觉得我没有完全理解你想要实现的目标。你可以上传一张反映你希望获得的最终结果的图片吗? - arkandas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接