SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR在API 28上不起作用

时间:2019-05-03 16:19:04

标签: android android-theme android-styles android-navigation-bar

我对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>

你们能告诉我丢失了什么吗?我对导航栏使用的代码与对状态栏使用的代码完全相同,但是只有状态栏才能使用灯光模式。谢谢你的帮助

2 个答案:

答案 0 :(得分:0)

在您的代码中,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));

答案 1 :(得分:0)

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

// Assuming 'channel' is the channel you want to change
const altName = 'Your other channel name',
  originalName = channel.name,
  timer = 30000; // 30 seconds in this example (30*1000)

function change() {
  if (channel.name == originalName) channel.setName(altName);
  else channel.setName(originalName);
}

change();
const channelInterval = setInterval(change, timer);

此后,您必须在主要活动中导入此标志:

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

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

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

现在,如果Im高于API 26,我将获得Light Nav和Status Bar!