如何更改导航栏颜色?

6
我希望状态栏是半透明的,导航栏是其他颜色而不是半透明的,比如蓝色或白色。
我的代码如下:
 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
        <item name="android:navigationBarColor">@color/colorPrimary</item>
    </style>

活动

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Window w = getWindow();
            w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
        } 

状态栏透明效果很好,但导航栏为什么没有改变颜色呢?导航栏

你的应用程序 API 级别是多少? - Lokesh Desai
仅限API级别24 - mr.klood4
4个回答

10

更改导航栏颜色的方法:

values-v21/style.xml

<item name="android:navigationBarColor">@color/blue_color</item>

程序化地:

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().setNavigationBarColor(ContextCompat.getColor(this, R.color.primary));
}

1
这个代码可以正常工作,但是如果添加以下代码来更改状态栏的透明度:w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);则导航栏的颜色没有改变。 - mr.klood4
如果您将状态栏设置为半透明,那么导航栏的颜色不会改变吗? - Lokesh Desai
1
如果 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window w = getWindow(); w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); }在setContentView()之前将此代码放入您的活动的onCreate方法中 希望这对您有用 - Lokesh Desai

2

请查看我之前的答案,它一定会帮助你得到结果。

你可以通过两种方式实现这个目标- 使用styleActivity

values-v21/style.xml

<item name="android:navigationBarColor">@color/navigationbar_color</item>

在Activity中使用兼容库
if (Build.VERSION.SDK_INT >= 21) {
    getWindow().setNavigationBarColor(ContextCompat.getColor(this, R.color.primary));
}

这个解决方案在启动屏幕显示时对我有效。然而,我想恢复默认设备导航栏颜色,因为许多设备使用不同的颜色(主要在白色和黑色之间)。有什么解决方案吗?非常感谢! - Mark Delphi

1
根据我对https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html中“FLAG_LAYOUT_NO_LIMITS”的理解,该标志允许窗口扩展到屏幕之外。使用此标志会将状态栏和导航栏都推出窗口。实际上,通过使用您的style.xml文件并添加一行代码,可以实现此效果。
<color name="myWindowBackground">#D7DEB5</color> 

要更改白色窗口背景,可以注意状态栏符号和导航栏符号,但不包括它们的栏。此外,使用以下代码:

int statusBarColor = w.getStatusBarColor();
String hexStatusBarColor = String.format("#%08X", (0xFFFFFFFF & statusBarColor));
int navigationBarColor = w.getNavigationBarColor();
String hexNavigationBarColor = String.format("#%08X", (0xFFFFFFFF & navigationBarColor));
Log.d("FLAGS", "statusBarColor: " + hexStatusBarColor + " -- navigationBarColor: " + hexNavigationBarColor);

你可以看到statusBarColor(“#00000000”完全透明)和navigationBarColor已正确设置,但未显示在窗口之外。
现在,如果不使用“FLAG_LAYOUT_NO_LIMITS”标志,您将获得透明的状态栏(与windowBackground相同的颜色),以及所需的导航栏颜色,但此时不确定代码尝试使用此标志获取什么其他内容。

这是初学者的绝佳答案。 - Rajamohan S

1
使用FLAG_LAYOUT_NO_LIMITS标志位后,视图将会扩展到状态栏和导航栏,这意味着您无法通过Window.setStatusBarColor设置颜色。我们的应用程序已经控制了在导航栏后面绘制视图的过程。我们需要在导航栏正后方准确地设置颜色。
我们需要通过设置padding bottom来处理重叠
通过设置padding bottom,您可以使导航栏背景颜色如下:
window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)

    val resourceId: Int = resources.getIdentifier("config_navBarInteractionMode",
                                                  "integer",
                                                  "android")

    ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { view, insets ->

        val systemBarInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars())

        if (systemBarInsets.bottom > 0) {

            view.setPadding(0,
                            systemBarInsets.top,
                            0,
                            systemBarInsets.bottom)

        }

        if (resourceId == 0) {
            view.setBackgroundColor(Color.LTGRAY)
        }

        return@setOnApplyWindowInsetsListener insets

    }

    val windowInsetsControllerCompat = WindowInsetsControllerCompat(window,
                                                                    window.decorView)
    windowInsetsControllerCompat.isAppearanceLightNavigationBars = true
    windowInsetsControllerCompat.isAppearanceLightStatusBars = true

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