2

我有一个问题,SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR不知何故不工作,但SYSTEM_UI_FLAG_LIGHT_STATUS_BAR正在工作。我目前正在使用 Android API 28。

那么发生了什么?在 API 23 及更低版本上,我按预期获得了半透明的状态栏和导航栏。在 API 23 和 API API 26 之间,我按预期获得了半透明的导航栏和灯光模式状态栏。但在 API 27 及更高版本上,我得到了 Light Mode Status Bar,但没有 Light Mode Navigation Bar。它只是普通的黑色,没有任何变化。

这是我的 MainActivity 以及基于 Android API 级别启用半透明或浅色模式状态栏和导航栏的代码(注意我的评论描述了哪些有效,哪些无效):

View decorView = getWindow().getDecorView();
Window win = getWindow();

//Setup Status Bar and Nav Bar white if supported
if(Build.VERSION.SDK_INT >= 27) {
    decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);// <- works not
    decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); // <- works
}
else if (Build.VERSION.SDK_INT >= 23 && Build.VERSION.SDK_INT < 27) {
    //this here works
    decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    win.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
} else {
    //this here works
    win.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    win.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}

这是我的 style.xml:

<resources xmlns:tools="http://schemas.android.com/tools">

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.MaterialComponents.Light">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorWhite</item>
        <item name="colorPrimaryDark">@color/colorWhite</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textColorPrimary">@color/colorBlack</item>
        <item name="android:fitsSystemWindows">true</item>
    </style>

</resources>

你们能告诉我缺少什么吗?我对导航栏使用与状态栏完全相同的代码,但只有状态栏获得浅色模式。感谢您的每一个帮助

4

2 回答 2

6

经过几个小时的测试,我想通了!首先,您必须在您的 style.xml 中将您的导航栏设置为白色,目标 API 高于 26:

 <item name="android:navigationBarColor" tools:targetApi="27">@android:color/white</item>

之后,您必须在 Main Activity 中导入此标志:

import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;

在您的代码中,您必须像这样一起设置标志:

if(Build.VERSION.SDK_INT >= 27) {
    decorView.setSystemUiVisibility(FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | 
             View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR |
             View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}

现在,如果我在 API 26 以上,我会得到 Light Nav 和 Status Bar!

于 2019-05-04T14:56:38.460 回答
3

在您的代码NAVIGATION_BAR中,标志被STATUS_BAR标志覆盖。

添加两个标志替换。

decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

更新:您还可以指定 NavigationBar 的颜色

getWindow().setNavigationBarColor(ContextCompat.getColor(this, R.color.primary));
于 2019-05-03T18:07:24.970 回答