Во-первых, вам нужно добавить больше цветов / тем в ваш файл styles.xml
.
Пример:
<!-- Base Light application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<!--Dark Theme Default-->
<style name="AppThemeDark" parent="Theme.AppCompat">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
В моем классе Base Application
я добавил эти 3методы. Мое приложение имеет 3 темы, если у вас их больше, вы можете соответствующим образом отредактировать код.
@Override
public void onCreate() {
super.onCreate();
PreferenceManager.setDefaultValues(this, R.xml.pref_main, false);
Context context = this;
context.setTheme(getUserTheme());
mInstance = this;
res = getResources();
shared = PreferenceManager.getDefaultSharedPreferences(context);
}
public static int getTheme(Context context, int light, int dark, int amoled) {
String darkTheme = context.getString(R.string.dark_mode_theme);
String amoledTheme = context.getString(R.string.amoled_mode_theme);
shared = PreferenceManager.getDefaultSharedPreferences(context);
String theme = shared.getString(Constants.PREFERENCE_THEME, darkTheme);
//Able to access these values outside the class!
if (theme.equals(darkTheme)) {
return dark;
} else if (theme.equals(amoledTheme)) {
return amoled;
} else {
return light;
}
}
private int getUserTheme() {
return getTheme(this, R.style.AppTheme, R.style.AppThemeDark, R.style.AppThemeAMOLED);
}
Если у вас нет класса, расширяющего Application
, создайте его, а затем добавьте в AndroidMainfest
, поместив эту строку в тег <Application>
android:name="App"
Я также добавил следующие методы в Base Activity Class
. Все мои действия расширяют этот класс. Если в вашем приложении есть только одно действие, это менее важно для вас.
protected abstract int getAppTheme(); //has to be implemented in anything that extends this class
protected void setAppTheme(int id) {
super.setTheme(id);
themeId = id;
}
protected void onResume() {
super.onResume()
if (themeId !== getAppTheme())
{
recreate();
}
}
После изменения темы вам необходимо заново создать действие, чтобы активировать изменения.
recreate();
Вы не можете вызвать его из статического метода, к сожалению. Я также рекомендовал бы проверить тему в onCreate, и если текущая тема не соответствует выбранной пользователем теме, измените тему и затем вызовите recreate();
.
Далее, в обычном действии, которое расширяетсябазовый класс активности, я добавил это. Обязательно держите его в одном и том же порядке везде. Если вы этого не сделаете, темы не будут соответствовать.
public int getAppTheme() {
return App.getTheme(this, R.style.AppTheme, R.style.AppThemeDark, R.style.AppThemeAMOLED);
}