Как переключить тему всего приложения по нажатию на кнопку?

У меня есть кнопка на боковой панели и мне нужно при нажатии на нее переходить со светлой темы на темную и на оборот. Как мне это лучше реализовать? Вот мой код.

    public class ThemeColors extends Intent {

private static int sTheme;

public static void applyTheme(Activity activity){
    String theme = PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext())
            .getString("pref_theme", "light");
    switch (theme){
        case "light":{
            activity.setTheme(R.style.AppTheme_Light);
            break;
        }
        case "dark":{
            activity.setTheme(R.style.AppTheme_Dark);
            break;
        }
        default:{
            activity.setTheme(R.style.AppTheme_NoActionBar);
            break;
        }
    }
}
public  ThemeColors(Activity activity, int theme) {
    sTheme = theme;
    activity.finish();
    activity.startActivity(new Intent(activity, activity.getClass()));
    activity.overridePendingTransition(android.R.anim.fade_in,
            android.R.anim.fade_out);
}

}


Ответы (1 шт):

Автор решения: DuosDuo

Можно переопределить метод getTheme у базового активити от которого наследуются все другие активити. Либо у Application переопределить этот метод, если все активности используют тему приложения..

Это позволяет менять темы у наследниках

@Override
public Resources.Theme getTheme() {
    Resources.Theme theme = super.getTheme();
    theme.applyStyle(StyleSettings.getSingleton().getStyleId(), true);//Получаем адрес ресурса установленного стиля
    return theme;
}

public int getStyleId(){
    String theme = PreferenceManager.getDefaultSharedPreferences(context)
            .getString("pref_theme", "light");
    switch (theme){
        case "light":{
            return R.style.AppTheme_Light;
            break;
        }
        case "dark":{
            return R.style.AppTheme_Dark;
            break;
        }
        default:{
            return R.style.AppTheme_NoActionBar;
            break;
        }
    }
}

StyleSettings - это класс в котором инкапсуляция работа с сохранением/чтением информации о текущем стиле.

→ Ссылка