#java #android #sharedpreferences #android-dark-theme
Вопрос:
Я пытаюсь реализовать светлую/темную тему в своем приложении. Смена тем отлично работает, если я не убью приложение. Но если я это сделаю, например, перед тем, как убить его, я настроил его на Темную тему. После перезапуска приложения каждое действие и фрагмент снова возвращаются к светлой теме.
Я реализовал общие предпочтения, но все еще не могу понять, в чем проблема.
Установите код кнопки » ОК » темы:
bottomSheetView.findViewById(R.id.settingsGeneral_changeTheme_btnOK).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { switch (tempTheme) { case 1: theme = 1; //update global value //update theme in shared pref if (mPreferences.contains(SP_THEME_KEY)) { SharedPreferences.Editor spEditor = mPreferences.edit(); spEditor.putInt(SP_THEME_KEY, theme); spEditor.apply(); } //set theme AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); break; case 2: theme = 2; //update global value //update theme in shared pref if (mPreferences.contains(SP_THEME_KEY)) { SharedPreferences.Editor spEditor = mPreferences.edit(); spEditor.putInt(SP_THEME_KEY, theme); spEditor.apply(); } //set theme AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); break; } bottomSheetDialog.dismiss(); } });
И в очень активном или фрагментном методе oncreate я делаю это:
mPreferences = getSharedPreferences(spFileName, MODE_PRIVATE); //get sp file if (mPreferences.contains(SP_THEME_KEY)) { //if got this key theme = mPreferences.getInt(SP_THEME_KEY, 2); switch(theme){ case 1: //dark setTheme(R.style.darkTheme); break; case 2: //light setTheme(R.style.appTheme); break; } } else { //if don't have this key (app first launch) theme = 2; //by default its light mode SharedPreferences.Editor spEditor = mPreferences.edit(); spEditor.putInt(SP_THEME_KEY, theme); spEditor.apply(); setTheme(R.style.appTheme); } super.onCreate(savedInstanceState); setContentView(R.layout.activity_general_settings);
Приложение для создания кода:
public class MigotoApplication extends Application { private final String SP_THEME_KEY = "sp_theme_key"; private SharedPreferences mPreferences; private String spFileName = "settingsSpFile"; private int theme; @Override public void onCreate() { super.onCreate(); if (mPreferences.contains(SP_THEME_KEY)) { //if got this key theme = mPreferences.getInt(SP_THEME_KEY, 2); switch(theme){ case 1: //dark AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); break; case 2: //light AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); break; } } else { //if don't have this key (app first launch) theme = 2; //by default its light mode SharedPreferences.Editor spEditor = mPreferences.edit(); spEditor.putInt(SP_THEME_KEY, theme); spEditor.apply(); AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); } } }
Ответ №1:
Вам нужно установить тему в приложении onCreate
, используя AppCompatDelegate.setDefaultNightMode
так же, как вы сделали это нажатием кнопки, но с сохраненными данными. Это изменит тему во всем приложении.
Вы можете удалить вызовы setTheme в начале.
Кроме того, вам нужно удалить if (mPreferences.contains(SP_THEME_KEY))
чеки. Может возникнуть проблема, когда значения не сохраняются, потому что для начала не было ключа. Редактор автоматически управляет созданием и использованием несуществующих ключей.
Комментарии:
1. Привет, я пробовал, но проблема все еще существует. Я вставил туда свой код onCreate приложения. Я сделал что-нибудь не так?
2. @haruya проверьте отредактированный ответ, я что-то пропустил.
3. Ах, я совершил глупую ошибку, забыв объявить класс приложения в файле манифеста! теперь все работает нормально! Спасибо