Общие предпочтения для сохранения переопределения пользователем режима «день/ночь» по умолчанию в приложении для Android

#java #android #sharedpreferences #theme-daynight

Вопрос:

Рекомендуемый способ установки дневного/ночного режима в приложении для Android находится в классе приложений. Вот рекомендуемый код для расширения класса приложения, пример кода Owl аналогичен:

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

Независимо от предпочтений пользователя, приведенный выше код будет продолжать устанавливать один и тот же режим дня/ночи при каждом запуске приложения. Я хотел бы предоставить пользователю контроль над дневным/ночным режимом в соответствии с рекомендацией по настройке в приложении:

Рекомендуется предоставить пользователю возможность переопределить тему по умолчанию в вашем приложении …. Распространенным способом реализации было бы использовать ListPreference, вызывая setDefaultNightMode() при изменении значения.

Вот мой код, который использует общие предпочтения в классе приложений для сохранения выбора режима дня/ночи пользователем при запуске процесса; но будет ли доступ к общим предпочтениям из класса приложений стабильным?

 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>
 

From 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";