#java #android #themes #android_style
У меня порядка 7 активностей и где-то в 6й мне надо вставить в настройки переключатель
выбора светлой или темной темы.
Использование данного кода не помогает:
public void theme(View view){
getApplication().setTheme(android.R.style.Theme_Holo);
}
Читал, что надо прописывать отдельный класс, который вызывать в каждом классе активностей
перед setContentView.
Ответы
Ответ 1
Для смены темы "на лету" нужно проделать довольно нудные манипуляции.
Обычно же все это происходит в настройках.
Через метод setTheme() вы можете устанавливать нужную тему в каждом активити, изменения
вступят в силу после перезапуска активити (возврата из настроек), в которой есть смена
темы. Метод должен применяться ДО метода setContentView().
Текущую выбранную тему лучше всего хранить в SharedPreferences, записывая туда значение
из настроек, а при запуске активити считывать оттуда.
public void onCreate(Bundle savedInstanceState) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
int theme = sp.getInt("THEME", R.style.AppTheme);
setTheme(theme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
где значение ключа "THEME", которое будет записываться в настройках, равно ID выбранной
темы, заданной в res/styles.xml, так, для примера со стилями ниже это будут значения:
R.style.AppTheme и R.style.AppThemeLight
UPD
Для тем основанных на AppCompat темы применяются не полностью, чтобы решить эту проблему
обязательно нужно указывать цвета ColorPrimary, ColorPrimaryDark и ColorAccent в файле
styles.xmlс темами, которые будут менятся в приложении:
styles.xml
Определяем сами цвета (вы можете выбрать свои, какие нравятся) в colors.xml:
#edeceb
#517c50
#0d0c0c
#2d2c2a
#a5c0df
#e2e0e0
Для тем, основанных на Holo так же нужно указать некоторые параметры , чтобы не было
проблем:
styles.xml
PS: Гарантированное применение темы произойдет при перезапуске приложения (а вообще
при перезапуске активити, что происходит не всегда, так как они не обязательно уничтожаются
при переходах)
Ответ 2
В общем, сработало даже без определения основных цветов.
в стилях задаем три темы:
style name="AppBaseTheme" parent="Theme.AppCompat">
style name="AppTheme" parent="AppBaseTheme">
style name="AppTheme.Light" parent = "Theme.AppCompat.Light">
в манифесте:
> android:theme="@style/AppBaseTheme"
в каждой активности (идет проверка переменной, содержащей значение темы):
public void onCreate(Bundle savedInstanceState) {
if (MainActivity.theme.equals("white")) {
setTheme(R.style.AppTheme_Light);
} else setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
и непосредственно переключатель (перегружает активность и ставит переменную в нужный
цвет для остальных):
MainActivity.theme="white";
Intent intent2 = getIntent();
finish();
startActivity(intent2);