Как динамически изменить тему Activity

109
24 мая 2021, 22:50

я еще только учусь программировать и у меня возникла проблема при изменении темы приложения, в идеале я хочу сделать так чтобы при нажатии на чекбокс в настройках тема в самих настройках и в приложении менялась со светлой на темную сразу же, но почему то тема в настройках меняется только при открытии их повторно а главной Активности только после перезапуска приложения, хотя во второй Активности тема меняется при повторном ее открытии. Я что то делаю не так и не могу понять что, прошу вашей помощи в этом, буду признателен за любые ответы.

Ниже прилагаю код моего приложения.

MainActivity

package com.example.testsettings;
public class MainActivity extends AppCompatActivity {
String LOG = "log";
private void setTheme() {
    if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("enabled", false)) {
        this.setTheme(R.style.AppTheme);
    } else {
        this.setTheme(R.style.AppThemeDark);
    }
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    Log.d(LOG, "onCreate");
    setTheme();
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}
@Override
protected void onResume() {
    Log.d(LOG, "onResume");
    setTheme();
    super.onResume();
}
@Override
protected void onDestroy() {
    Log.d(LOG, "onDestroy");
    super.onDestroy();
}
@Override
protected void onPause() {
    Log.d(LOG, "onPause");
    super.onPause();
}
@Override
protected void onStart() {
    Log.d(LOG, "onStart");
    super.onStart();
}
@Override
protected void onStop() {
    Log.d(LOG, "onStop");
    super.onStop();
}
public void setPrefs(View view) {
    Intent intent = new Intent(this, Settings.class);
    startActivity(intent);
}
public void onclick(View view) {
    Intent intentA = new Intent(this, Main2Activity.class);
    intentA.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intentA);
}

}

Main2Activity

public class Main2Activity extends AppCompatActivity {
private void setTheme() {
    if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("enabled", false)) {
        this.setTheme(R.style.AppTheme);
    } else {
        this.setTheme(R.style.AppThemeDark);
    }
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme();
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
}

SettingsActivity

public class Settings extends AppCompatActivity implements OnSharedPreferenceChangeListener {
private void setTheme() {
    if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("enabled", false)) {
        this.setTheme(R.style.AppTheme);
    } else {
        this.setTheme(R.style.AppThemeDark);
    }
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme();
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings);
    SettingsFragment fragment = new SettingsFragment();
    getFragmentManager().beginTransaction().add(R.id.prefs_content, fragment).commit();
}
public static class SettingsFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.settings);
    }
}

public void onSharedPreferenceChanged (SharedPreferences sharedPreferences, String string){
    if (string.equals("enabled")){
        this.finish();
        this.startActivity(new Intent(this, this.getClass()));
        this.setResult(-1, new Intent());
    }
}

Settings.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="Theme"
android:key="prefs_key">
<CheckBoxPreference
    android:key="enabled"
    android:summary="Темная тема"
    android:title="dark"
    android:defaultValue="true"/>

Answer 1

Для смены темы внутри метода onCreate() в Activity необходимо прописать два метода: setTheme() и setContentView(), которые Вы успешно прописали в коде. Однако тема меняется только после вызова метода onCreate(). Вы сейчас пересоздаёте свою верхнюю Activity (тем самым вызывая onCreate() у данной Activity), однако забываете про тот стек Activity, который вы открывали ранее. Их вы НЕ пересоздаёте, следовательно в них у Вас тема НЕ меняется. Как пересоздать весь стек Activity хорошо объясняется в данном ответе: https://stackoverflow.com/a/28799124/7120432

Answer 2

Благодаря ответу выше получилось изменить тему в главной активности дополнив медод onStop в MainActivity

@Override
protected void onStop() {
    super.onStop();
    finish();     
}
READ ALSO
Зайти на почту через Java

Зайти на почту через Java

в общем пишу бота для множественного входа на почту (для себя)есть 300 почт, нужно поочередно на них заходить и выходить так, чтобы сервер понимал,...

143
Как cделать рейтинг игроков? (java)

Как cделать рейтинг игроков? (java)

Есть код игры "Угадай число"Но рейтинг участников вывести не могу

125
Как в HashMap увеличить значение числа

Как в HashMap увеличить значение числа

Как HashMap<String, Integer> map увеличить значение числа, например, я вставил в map значение: mapput("example", 5); и как его по ключу увеличить?

138
Смена fragment в CountDownTimer

Смена fragment в CountDownTimer

уважаемые программисты и кодеры, возникла следующая проблема, которую я уже безуспешно пытаюсь исправить без малого деньУ меня есть метод...

104