Изменения не распространяются на все виды деятельности.

Я реализовал ночной режим в своем приложении. Пользователь может менять настройки ночного режима в активности профиля. Порядок действий следующий.

TabbedActivity >> DisplayActivity, ProfileActivity

Измененные настройки применяются только в текущем действии. (Т.е. активности профиля). Если пользователь нажимает кнопку «Назад», изменения не применяются к этим действиям. Кто-нибудь помогает мне применить изменения ко всем действиям. Когда мы закрываем приложение и открываем его снова .Изменения применяются, но обратное нажатие не работает.

Это код, который я использую.

 @Override
protected void onCreate(Bundle savedInstanceState) {
    final SharedPreferences sharedPreferences = 
getSharedPreferences("NIGHT_MODE", MODE_PRIVATE);
    int result=sharedPreferences.getInt("NIGHT_MODE_OPTION",0);

    if (result==2){
        setTheme(R.style.darkTheme);
    }else setTheme(R.style.AppTheme);
    loadLocale();
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile);
final SharedPreferences.Editor editor = getSharedPreferences("NIGHT_MODE", MODE_PRIVATE).edit();



    if (result==2){
        night.setChecked(true);
    }
    night.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked){
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                editor.putInt("NIGHT_MODE_OPTION",AppCompatDelegate.MODE_NIGHT_YES);
                editor.apply();
                startActivity(getIntent());
            }else {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                editor.putInt("NIGHT_MODE_OPTION",AppCompatDelegate.MODE_NIGHT_NO);
                editor.apply();
               startActivity(getIntent());

            }
        }
    });

}


person Thrishool MSM    schedule 10.06.2019    source источник


Ответы (2)


'я думаю, что лучше будет перезапускать / сбрасывать приложение каждый раз при изменении темы'

Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage( 
getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
startActivity(i); finish(); 
person Muhmmad Umair    schedule 10.06.2019
comment
Объясните, пожалуйста, первую строчку кода. Я не понял. Что такое MyApp и А. Я имею в виду, что мне следует писать в моем случае. Я обновляю данные в профиле. - person Thrishool MSM; 10.06.2019
comment
Я применил ваш код, но когда я нажимаю кнопку возврата, изменения не применяются. Если я закрою и снова открою приложение, то изменения будут применены - person Thrishool MSM; 10.06.2019
comment
Намерение i = getBaseContext (). GetPackageManager () .getLaunchIntentForPackage (getBaseContext (). GetPackageName ()); i.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP); i.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity (я); финиш(); попробуй это - person Muhmmad Umair; 10.06.2019
comment
Мне нужно написать этот код, в какое действие я вношу изменения? - person Thrishool MSM; 10.06.2019
comment
вам нужно написать этот код в прослушивателе кликов, где вы меняете тему - person Muhmmad Umair; 10.06.2019
comment
Спасибо, братан. Это сработало. Все приложение было перезапущено. Пожалуйста, отредактируйте ответ. - person Thrishool MSM; 10.06.2019
comment
Есть ли другой способ, братан, без перезапуска всего приложения и применения изменений ко всему приложению. - person Thrishool MSM; 10.06.2019
comment
да, вы должны использовать onResume () в каждом действии для внесения изменений. это не очень хорошая практика. - person Muhmmad Umair; 10.06.2019

Поскольку вы не рассматриваете жизненный цикл Android. Вы все настраиваете внутри onCreate. Однако при переключении между действиями жизненный цикл текущего действия изменяется соответствующим образом. Здесь очень хорошо объясняется жизненный цикл

Решение:

Когда вы вернетесь к предыдущему действию, вызывается onResume. Вы должны применить все изменения внутри этого метода

override fun onResume() {
   super.onResume()

   //Read your settings from SharedPrefs then apply, here
}
person Jasurbek    schedule 10.06.2019
comment
Значит, нет необходимости вносить изменения в onCreate? - person Thrishool MSM; 10.06.2019
comment
Да, именно так, поскольку этот метод спорен, всегда вызывается - person Jasurbek; 10.06.2019