在 Android 模拟器中 运行 时无法更改 Chrome 自定义选项卡导航栏颜色

Can't change Chrome Custom Tabs navigation bar color when running in the Android Emulator

为 Chrome 自定义标签指定颜色似乎有点不靠谱。您可以指定三种颜色:工具栏颜色、"secondary toolbar" 颜色和导航栏颜色。

似乎有两种方法可以控制这些。一种是直接在Builder中设置三个属性,像这样:

val builder = CustomTabsIntent.Builder()
builder.setToolbarColor(ContextCompat.getColor(context, R.color.colorPrimary))
builder.setSecondaryToolbarColor(ContextCompat.getColor(context, R.color.colorPrimaryDark))
builder.setNavigationBarColor(ContextCompat.getColor(context, R.color.colorPrimary))
val customTabsIntent = builder.build()

另一个是指定params和scheme。存在三种可能的方案:COLOR_SCHEME_DARKCOLOR_SCHEME_LIGHTCOLOR_SCHEME_SYSTEMCOLOR_SCHEME_SYSTEM,我认为,让系统决定是使用深色还是浅色方案,而其他两个则强制使用深色或浅色方案。当您指定参数时,您可以为浅色方案或深色方案设置那些颜色参数(工具栏、辅助工具栏、导航栏)。我认为如果你强制使用黑暗方案,你会为黑暗方案指定参数。如果您使用系统方案,那么您可以指定浅色参数和深色参数,并且将根据系统决定使用深色或浅色方案来使用适当的值。无论如何,这是我最好的猜测。

例如:

val builder = CustomTabsIntent.Builder()
builder.setColorScheme(COLOR_SCHEME_DARK)
val darkParams = CustomTabColorSchemeParams.Builder()
    .setToolbarColor(ContextCompat.getColor(context, R.color.colorPrimary))
    .setSecondaryToolbarColor(ContextCompat.getColor(context, R.color.colorPrimaryDark))
    .setNavigationBarColor(ContextCompat.getColor(context, R.color.colorPrimary))
    .build()
builder.setColorSchemeParams(COLOR_SCHEME_DARK, darkParams)
val customTabsIntent = builder.build()

(我尝试了不同的选项来设置配色方案和设置参数使用的方案)。

作为有趣的旁注,如果您尝试 builder.setColorSchemeParams(COLOR_SCHEME_SYSTEM, params),您将遇到崩溃:java.lang.IllegalArgumentException: Invalid colorScheme: 0。显然这是一个功能,而不是错误。您应该为深色或浅色方案指定颜色参数,而不是系统,它会自动在浅色和深色之间进行选择。

我相信你也可以同时使用这两种方法。只有在无法使用第二种方法(为配色方案设置颜色参数)时,才使用第一种方法(直接在构建器中设置颜色值)。根据documentation

to maintain compatibility with browsers not supporting this API, do provide the defaults.

这就是背景信息。这是我的结果。

要更改工具栏颜色,请使用第一种方法 (builder.setToolbarColor)。简单易行。但使用第二种方法 (CustomTabColorSchemeParams) 无任何作用。

我还没有实际测试 "secondary toolbar"。我不确定那是什么。它似乎是一个可选的底部工具栏,尽管它的使用方式 deprecated 更倾向于 RemoteViews。我认为它与大多数人无关。

这两种方法都不影响导航栏颜色。

从另一个角度来看,使用第二种方法,builder.setColorScheme(COLOR_SCHEME_DARK) 可用于强制 Chrome 自定义选项卡使用浅色方案或深色方案。这似乎工作得很好。但是 none 的颜色参数似乎实际上会影响任何东西。

也许有人可以解释一些这种奇怪的行为,或者确认这是一个 Google 错误。或者你可以指出我可能做错的事情。我的主要问题是:如何真正更改 Chrome 自定义选项卡的导航栏颜色?正如我所指出的,这些方法似乎不起作用。

更改导航栏颜色在物理设备上有效,但在模拟器中无效。

您应该尝试使用 setDefaultColorSchemeParams(params)

而不是 setColorSchemeParams(CustomTabsIntent.COLOR_SCHEME_DARK, params)