使用 material 组件 DayNight 主题的深色模式时,微调项文本的样式不正确

Spinner item text isn't being styled correctly when using dark mode of the material component DayNight theme

在我们的应用中,我们使用 Theme.MaterialComponents.DayNight.NoActionBar 作为应用主题的父级来实现可切换的昼夜主题。它似乎在我们的应用程序中无处不在,除了微调器项目。在深色主题中,微调项的文本为黑色。这特别奇怪,因为微调器下拉项的颜色正确。

Spinner Item

Spinner Dropdown Items

我已经尝试为微调项创建自定义布局:

<?xml version="1.0" encoding="utf-8"?>
<TextView
    android:id="@+id/spinner_item_text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android"/>

但是,任何使用主题属性对其应用样式的尝试都会导致应用程序崩溃(例如,添加 android:textColor="?attr/colorOnPrimary" 会导致应用程序在尝试为微调器充气时崩溃)。

我想要的是根据使用 setDefaultNightMode() 选择的主题正确着色微调项的 TextView,就像所有其他 TextView 一样。如果我遗漏了任何需要包含的重要内容,请告诉我。

找出问题所在。应用程序崩溃是因为微调器的 TextView 没有应用主题。为了让微调器正确设置主题,我在我的微调器项目中添加了一个 style

<?xml version="1.0" encoding="utf-8"?>
<TextView
    android:id="@+id/spinner_item_text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    style="@style/Objective.SpinnerItemTextView"
    xmlns:android="http://schemas.android.com/apk/res/android"/>

样式如下:

<style name="Objective.SpinnerItemTextView" parent="@android:style/Widget.TextView">
    <item name="android:theme">@style/Theme.Objective</item>
    <item name="android:textColor">?attr/colorOnBackground</item>
</style>

经过这些修改后,当主题改变时,文字颜色仍然没有改变。问题出在我传递给 ArrayAdapter 的上下文中。最初,我是在传递应用程序上下文,但显然 。更改为使用基本上下文解决了这个问题。

ArrayAdapter.createFromResource(
    requireActivity().baseContext,
    R.array.deadline_types_array,
    R.layout.spinner_item).also { adapter ->
        adapter.setDropDownViewResource(
            android.R.layout.simple_spinner_dropdown_item)
        deadlineTypeDropdown.adapter = adapter
    }

进行这些更改后,微调器的主题已正确设置。我没有测试过,但您可能不必创建自定义微调器布局。相反,您可以修改 ?android:attr/spinnerItemStyle 以使用自定义样式,不过我还没有尝试过。