【问题标题】:How can I get dark mode to work on my app?如何让暗模式在我的应用程序上运行?
【发布时间】:2020-01-02 20:58:06
【问题描述】:

我为用户的暗模式偏好设置了一个具有不同值的 ListPreference。现在,我只想让应用程序与 Android Q 中引入的新暗模式实现一起工作。如果我设置系统暗模式,应用程序会发生变化,因为我在styles.xml 中启用了isforcedarkallowed

设置片段:

public static class SettingsFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.root_preferences, rootKey);
        PreferenceScreen screen = getPreferenceScreen();
        final ListPreference listPreference = (ListPreference) findPreference("theme");
        Preference preference = (Preference) findPreference("notq");
        int api = Integer.valueOf(android.os.Build.VERSION.SDK_INT);
        if (api > 28) {
            screen.removePreference(preference);
        }
        if (api < 29) {
            screen.removePreference(listPreference);
        }
        listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                listPreference.setValue(newValue.toString());
                theme = String.valueOf(listPreference.getEntry());
                Log.d("debug", theme);
                if (theme.equals("Light")) {
                    AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_NO);
                }
                if (theme.equals("Dark")) {
                    AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_YES);
                }
                if (theme.equals("System default")) {
                    AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_FOLLOW_SYSTEM);
                }
                return true;
            }
        });
    }
}

Arrays.xml(暗模式偏好的值)

<resources xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Reply Preference -->
<string-array name="theme_entries">
    <item>Light</item>
    <item>Dark</item>
    <item>System default</item>

</string-array>

<string-array name="theme_values">
    <item>light</item>
    <item>dark</item>
    <item>default1</item>
</string-array>
</resources>

我的列表偏好:

 <ListPreference
    android:id="@+id/list"
    app:entries="@array/theme_entries"
    app:entryValues="@array/theme_values"
    app:key="theme"
    app:title="@string/theme_title"
    app:useSimpleSummaryProvider="true" />

以及我正在使用的应用主题(styles.xml):

 <style name="AppTheme2" parent="Theme.AppCompat.DayNight.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="android:forceDarkAllowed" tools:targetApi="q">true</item>
    <item name="android:isLightTheme" tools:targetApi="q">true</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">#FFFFFF</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:backgroundDimEnabled">false</item>
</style>

有什么建议吗?

【问题讨论】:

  • 还没有?因为您的代码似乎与它兼容。 AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_FOLLOW_SYSTEM);据我所知,这可以满足您的要求

标签: java android xml android-dark-theme


【解决方案1】:

在您的styles.xml 中,当您启用forceDarkAllowed 时,您不应将Theme.AppCompat.DayNight.DarkActionBar 作为父级。将其更改为 Theme.AppCompatTheme.MaterialComponents。当forceDarkAllowed 设置为true 时,您不能从昼夜主题继承。你可以在这里阅读https://developer.android.com/guide/topics/ui/look-and-feel/darktheme forcedark部分。

【讨论】:

    【解决方案2】:
    String theme = String.valueOf(listPreference.getEntry()); 
    

    应该可以正常工作,你只是没有将主题声明为字符串

    :)

    【讨论】:

      猜你喜欢
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多