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