У меня порядка 7 активностей и где-то в 6й мне надо вставить в настройки переключатель выбора светлой или темной темы.
Использование данного кода не помогает:
public void theme(View view){
getApplication().setTheme(android.R.style.Theme_Holo);
}
Читал, что надо прописывать отдельный класс, который вызывать в каждом классе активностей перед setContentView
Ответ
Для смены темы "на лету" нужно проделать довольно нудные манипуляции.
Обычно же все это происходит в настройках.
Через метод 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
Для тем, основанных на Holo так же нужно указать некоторые параметры , чтобы не было проблем:
styles.xml
PS: Гарантированное применение темы произойдет при перезапуске приложения (а вообще при перезапуске активити, что происходит не всегда, так как они не обязательно уничтожаются при переходах)
Комментариев нет:
Отправить комментарий