Темная тема приложения для Android исчезла после того, как приложение было убито и перезапущено

#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. Ах, я совершил глупую ошибку, забыв объявить класс приложения в файле манифеста! теперь все работает нормально! Спасибо