为什么在Android暗黑主题(夜间模式)下有些drawable被反转,而有些则没有?

8

我的应用程序使用了Theme.AppCompat.DayNight.NoActionBarAppTheme,并且有一个导航抽屉。我所有的可绘制对象都是XML矢量图,并且它们中的路径是黑色的。对于这些可绘制对象的用途,在我的侧边栏菜单中,Android或SDK中某个地方已经将可绘制对象反转,使得路径实际上是白色的(或者接近白色的颜色,可能实际上是colorAccent)。这很好。

但是当我自己将相同的可绘制对象放置在操作栏中作为菜单项时,它没有被反转,仍然使用黑色路径。这是怎么回事?我如何让同样的魔法在那里发生?

主题:

<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
    <item name="colorAccent">@color/primaryTextColor</item>
    <item name="android:navigationBarColor">#00000000</item>
</style>

主活动布局中的操作栏:

<androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

menu/action_bar.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <item android:id="@+id/bookmarkAction"
        android:title="@string/bookmark"
        android:icon="@drawable/ic_bookmark_off"
        app:showAsAction="always"
        tools:ignore="AlwaysShowAction" />
</menu>

以下是我如何展开菜单并处理片段中书签的切换(在这里ToggleButton似乎不会为我节省任何工作):

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.action_bar, menu)
    super.onCreateOptionsMenu(menu, inflater)
}

// Swap out the bookmark icon in the options menu depending
// on whether this command is bookmarked or not.
override fun onPrepareOptionsMenu(menu: Menu) {
    super.onPrepareOptionsMenu(menu)

    val bookmarkMenuItem = menu.getItem(0)
    val commandName = viewModel.command.value?.name

    if (model?.bookmarkedCommands?.contains(commandName)!!) {
        Log.v(logTag, "${commandName} is bookmarked")

        bookmarkMenuItem?.icon = ContextCompat.getDrawable(requireContext(),
            R.drawable.ic_bookmark_on)
    }
    else {
        Log.v(logTag, "${commandName} is not bookmarked")

        bookmarkMenuItem?.icon = ContextCompat.getDrawable(requireContext(),
            R.drawable.ic_bookmark_off)
    }
}

侧边栏图标反色(好):

sidenav

动作栏图标未反色(不好):

enter image description here


你能分享一下你的主题吗?你在主题中设置了colorControlNormal吗?你能分享一下你是如何设置图标以及使用了什么类型的操作栏吗? - ataulm
@ataulm 当然,给你。我没有在任何地方设置colorControlNormal。 - Eliot
2个回答

5

我99%确定AppCompat的工具栏或至少MaterialToolbar会自动使用主题属性进行着色,但看起来并不是这样。

回答你的问题“为什么Android在黑暗主题(夜间)反转我的某些可绘制对象,而另一些则没有?”这是因为使用这些可绘制对象的组件未使用主题属性进行着色。


有几种方法可以实现您想要的效果。这些都假定您想要使用 colorControlNormal,否则选择您喜欢的任何颜色属性。

colorControlNormal 在 AppCompat 中有默认值(深灰色),在 values-night 变体中为白色(如果您使用 DayNight 主题,则会得到该变体)。

在矢量可绘制对象中设置图标着色

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:tint="?attr/colorControlNormal"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path
        android:fillColor="#FF00FF"
        android:pathData="M17,3H7c-1.1,0 -1.99,0.9 -1.99,2L5,21l7,-3 7,3V5c0,-1.1 -0.9,-2 -2,-2z" />
</vector>

这可能会产生一种潜在的不良效果,即会在您使用该可绘制对象的其他位置上给它染上色调(这取决于其他地方是否应用了自己的色调)。

在菜单中设置图标色调

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <item android:id="@+id/bookmarkAction"
        android:title="@string/bookmark"
        android:icon="@drawable/ic_bookmark_off"
        app:iconTint="?attr/colorControlNormal"
        app:showAsAction="always"
        tools:ignore="AlwaysShowAction" />
</menu>

如果设置了drawable的色调,这个会覆盖它。


谢谢!我选择将其设置在矢量可绘制对象中。 - Eliot

1

帮助我避免我的可绘制对象颜色反转的方法是将AppCompatImageView的背景设置为透明。因此,我会尝试调整背景和色调,希望这也能帮到你。


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