Как переключить тему всего приложения по нажатию на кнопку?
У меня есть кнопка на боковой панели и мне нужно при нажатии на нее переходить со светлой темы на темную и на оборот. Как мне это лучше реализовать? Вот мой код.
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 - это класс в котором инкапсуляция работа с сохранением/чтением информации о текущем стиле.