轻量级导航栏

16

我想将导航栏的颜色从黑色(带白色图标)更改为白色(带黑色图标)。

期望的结果(在uCrop中看到):

Light Navigation Bar

我知道如何通过android:windowLightStatusBar更改状态栏的颜色。

导航栏是否有类似的属性?


这里有一个重复的问题:https://dev59.com/wlwY5IYBdhLWcg3wCD6W。 你在Nougat设备上运行过uCrop吗?对我来说它不起作用,所以上面的黑色图标似乎只是Photoshop图形 :/ - wrozwad
8个回答

10

对于 API 27+,您可以通过样式来实现:

<!-- added in API 27 -->
<item name="android:windowLightNavigationBar">true</item>

<!-- required to contrast the dark buttons -->
<item name="android:navigationBarColor">@android:color/white</item>

<!-- optional -->
<item name="android:navigationBarDividerColor">@android:color/black</item>

虽然XML属性是在API 27中引入的,但轻型导航栏的支持在更早的版本中就已经引入了,即通过API 26中的SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR

因此,为了针对最早支持它的设备进行定位,您需要通过代码而不是XML样式来实现。


1
我建议使用#E0E0E0(灰色300)作为“android:navigationBarDividerColor”的好颜色。 - Marcola Carr

9
您可以在v26/styles.xml中控制导航栏的背景颜色:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="AppTheme.Base">
        ...
        <item name="android:navigationBarColor">@android:color/white</item>
    </style>
</resources>

为了让导航栏中按钮的颜色与浅色背景相匹配,您需要在活动的DecorView上设置2个标志。

在您的活动中:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    View decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | 
                                    SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
}

为了实现这个效果,窗口必须请求FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS但不应请求FLAG_TRANSLUCENT_NAVIGATION。
参见: https://developer.android.com/.../View#SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR

1
图标变成白色,你再也看不到它们了。 - Oliver Dixon
@OliverDixon 当应用decorView.setSystemUiVisibility(FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR)时,图标会变成深色。 - Bert Wijnants
1
通过使用状态栏图标会变成白色。那么如何设置两者都为浅色呢? - Akash Ratanpara

4

那么在 Android O 之前呢?这是可能的吗? - Mansoor V.M
3
不行,API 26以前不可能实现,并且由于某些原因,轻色调导航栏的XML/主题属性直到API 27才可用。 - patrick.elmquist
1
要使用XML轻量级导航栏,请使用:android:windowLightNavigationBar - Mygod
1
@patrick.elmquist 真是太棒了...如果你的目标是<27,特别是如果你想同时设置一个轻量级状态栏,那么这个属性基本上就没用了。 - user12194200

2
请在您的应用程序的BaseTheme中添加此内容。
<item name="android:navigationBarColor">@color/yourNavigationColor</item>

11
在这种情况下,我只改变了背景颜色而没有改变图标的颜色。 - lopez.mikhael

2

我在所有的Activity中使用这个Kotlin扩展函数。只需将这些函数复制到您的项目中的某个位置,您可以随时使用它们来更改状态栏颜色或导航栏颜色,或更改浅色/深色状态栏或浅色/深色导航栏(如果可能)。

fun AppCompatActivity.setStatusBarColor(color: Int)
{
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
    window.setStatusBarColor(color)
}

fun AppCompatActivity.setStatusLightDark(is_light: Boolean)
{
    if (Build.VERSION.SDK_INT < 23)
    {
        return
    }

    var flags = window.decorView.systemUiVisibility
    if (is_light)
    {
        flags = flags and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv()
    }
    else
    {
        flags = flags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
    }
    window.decorView.systemUiVisibility = flags
}

fun AppCompatActivity.setNavBarColor(color: Int)
{
    window.setNavigationBarColor(color)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
    {
        window.setNavigationBarDividerColor(color)
    }
}

fun AppCompatActivity.setNavBarLightDark(is_light: Boolean)
{
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
    {
        return
    }

    var flags = window.decorView.systemUiVisibility
    if (is_light)
    {
        flags = flags and View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.inv()
    }
    else
    {
        flags = flags or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
    }
    window.decorView.systemUiVisibility = flags
}

使用方法:

override fun onCreate(savedInstanceState: Bundle?)
{
    super.onCreate(savedInstanceState)
    val color_status_bar = ContextCompat.getColor(this,R.color.yellow)
    val color_nav_bar = ContextCompat.getColor(this,R.color.red)

    this.setStatusBarColor(color_status_bar)
    this.setStatusLightDark(false)
    this.setNavBarColor(color_nav_bar)
    this.setNavBarLightDark(true)
    .....
}

1
从Oreo+开始使用:
    <item name="android:windowLightNavigationBar">true</item>

在Oreo之前,浅色主题的支持不够完善。


0

这是我在API 24上以编程方式执行它的指令(当然它将从27+到33生效),使用Java(MainActivity):

WindowInsetsControllerCompat windowInsetsControllerCompat = new WindowInsetsControllerCompat(getWindow(), getWindow().getDecorView());
windowInsetsControllerCompat.setAppearanceLightNavigationBars(true);

使用WindowInsetsControllerCompat,您还可以轻松地通过编程方式更改状态栏的亮度模式:

windowInsetsControllerCompat.setAppearanceLightStatusBars(true);

-27

这个栏叫做 Snackbar,试试这个:

snackBarView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.BLACK));

lopez.mikhael已经正确命名了导航栏,它被称为“navigation bar”。然而,snackbar是不同的。这使得你的代码在这个问题上是错误的。 - Amy

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