首页 > 解决方案 > Android 图标和单选按钮不遵循日/夜模式

问题描述

在创建了一个非常基本的设置 AppCompatActivity 和 PreferenceFragmentCompat 以更改我的应用程序的日/夜模式后,但浅色主题似乎不适用于整个应用程序。应用程序其余部分中的所有图标都不想跟随,ListPreference 对话框中的单选按钮似乎也保留了它们原来的深色主题。我在这里做错了什么?

系统/黑暗

光

SettingsActivity.java

public class SettingsActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
        getSupportFragmentManager().beginTransaction().replace(R.id.settingsFrame, new SettingsFragment()).commit();
    }

    public static class SettingsFragment extends PreferenceFragmentCompat {

        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.settings, rootKey);

            findPreference(getString(R.string.pref_theme)).setOnPreferenceChangeListener((preference, newValue) -> {
                if (newValue.toString().equals(getString(R.string.light))) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                } else if (newValue.toString().equals(getString(R.string.dark))) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                } else {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
                }
                return true;
            });
        }
    }
}

设置.xml

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

    <ListPreference
        android:key="@string/pref_theme"
        android:icon="@drawable/ic_day_24"
        android:title="@string/theme"
        app:useSimpleSummaryProvider="true"
        android:entries="@array/themes"
        android:entryValues="@array/themes"
        android:defaultValue="@string/system"/>
</PreferenceScreen>

ic_day_24.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="?attr/colorControlNormal">
  <path
        android:fillColor="@android:color/white"
        android:pathData="M20,8.69L20,4h-4.69L12,0.69 8.69,4L4,4v4.69L0.69,12 4,15.31L4,20h4.69L12,23.31 15.31,20L20,20v-4.69L23.31,12 20,8.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4z"/>
</vector>

主题.xml

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.FloatingTimer" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <item name="colorPrimary">@color/red</item>
        <item name="colorPrimaryVariant">@color/blue_dark</item>
        <item name="colorOnPrimary">@color/white</item>
        <item name="colorSecondary">@color/orange_normal</item>
        <item name="colorSecondaryVariant">@color/orange_dark</item>
        <item name="colorOnSecondary">@color/white</item>
        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
        <item name="colorSurface">@color/blue_normal</item>
        <item name="colorOnSurface">@color/white</item>
        <item name="colorControlNormal">@color/white</item>
    </style>

    <style name="Theme.FloatingTimer.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
</resources>

theme.xml(夜晚)

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.FloatingTimer" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <item name="colorPrimary">@color/red</item>
        <item name="colorPrimaryVariant">@color/blue_dark</item>
        <item name="colorOnPrimary">@color/white</item>
        <item name="colorSecondary">@color/orange_normal</item>
        <item name="colorSecondaryVariant">@color/orange_dark</item>
        <item name="colorOnSecondary">@color/white</item>
        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
        <item name="colorSurface">@color/blue_normal</item>
        <item name="colorOnSurface">@color/white</item>
        <item name="colorControlNormal">@color/white</item>
    </style>

    <style name="Theme.FloatingTimer.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
</resources>

颜色.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="blue_light">#FF6E9FCF</color>
    <color name="blue_normal">#FF3F7FBF</color>
    <color name="blue_dark">#FF2F6090</color>
    <color name="orange_light">#FFD97F3F</color>
    <color name="orange_normal">#FFCC5500</color>
    <color name="orange_dark">#FF9A4000</color>
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>
    <color name="translucent_black">#CC000000</color>
    <color name="translucent_dark_gray">#CC333333</color>
    <color name="translucent_light_gray">#CCCCCCCC</color>
    <color name="translucent_white">#CCFFFFFF</color>
    <color name="translucent_overlay">@color/translucent_white</color>
    <color name="list_icon">@color/black</color>
</resources>

colors.xml(夜晚)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="translucent_overlay">@color/translucent_dark_gray</color>3
    <color name="list_icon">@color/white</color>
</resources>

标签: androidandroidxandroid-dark-themeandroid-darkmode

解决方案


好吧,我<item name="colorControlNormal">@color/white</item>在我的主题中使用了自己。删除后,图标颜色现在是正确的。


推荐阅读