SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR 不工作 API 28
SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR not working on API 28
我有一个问题,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>
你们能告诉我缺少什么吗?我对导航栏使用与对状态栏完全相同的代码,但只有状态栏获得亮模式。感谢您的帮助
在您的代码中,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));
经过几个小时的测试,我明白了!首先,您必须在 xml 中将导航栏设置为白色,在 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 和状态栏!
我有一个问题,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>
你们能告诉我缺少什么吗?我对导航栏使用与对状态栏完全相同的代码,但只有状态栏获得亮模式。感谢您的帮助
在您的代码中,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));
经过几个小时的测试,我明白了!首先,您必须在 xml 中将导航栏设置为白色,在 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 和状态栏!