0

在 Android 应用程序中设置日/夜模式的推荐方法是在 Application 类中。这是扩展 Application 类的推荐代码,Owl 示例代码类似:

public class MyApplication extends Application {
    public void onCreate() {
        super.onCreate();
        AppCompatDelegate.setDefaultNightMode(
            AppCompatDelegate.MODE_NIGHT_YES);
    }
}

无论用户偏好如何,上述代码将在每次应用启动时继续设置相同的日/夜模式。我想根据 In App Setting建议让用户控制日/夜模式:

建议为用户提供一种方法来覆盖您的应用程序中的默认主题...。一种常见的实现方法是通过 ListPreference,在值更改时调用 setDefaultNightMode()。

这是我的代码,它使用 Application 类中的共享首选项在进程启动时保持用户日/夜模式选择;但是从 Application 类访问共享首选项会稳定吗?

public class MyApplication extends Application {

    private static final String KEY = SettingsFragment.LIGHT_DARK_THEME;

    @Override
    public void onCreate() {
        super.onCreate();

        int nightMode;
        if (Q <= SDK_INT) {
            nightMode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM;
        } else {
            nightMode = AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY;
        }

        final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        final String pos = preferences.getString(MyApplication.KEY, "");
        if (!pos.isEmpty()) {
            nightMode = Integer.valueOf(pos);
        }
        AppCompatDelegate.setDefaultNightMode(nightMode);
    }
}

来自 arrays.xml

<!-- Day/Night Preferences -->
<string-array name="DayNightListArray">
    <item>Day</item>
    <item>Night</item>
    <item>System setting</item>
</string-array>

<string-array name="DayNightListValues">
    <item>1</item>
    <item>2</item>
    <item>-1</item>
</string-array>

来自 root_preferences.xml

   <ListPreference
        app:defaultValue="-1"
        app:entries="@array/DayNightListArray"
        app:entryValues="@array/DayNightListValues"
        app:key="light_dark_theme"
        app:title="Day/Night Theme"
        app:useSimpleSummaryProvider="true" />

来自 SettingsFragment.java

// Key to the Day/Night ListPreference
public static final String LIGHT_DARK_THEME = "light_dark_theme";
4

0 回答 0