Страницы

Поиск по вопросам

понедельник, 12 ноября 2018 г.

Как в приложении Android сделать переключение тем?

У меня порядка 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
#edeceb #517c50 #0d0c0c #2d2c2a #a5c0df #e2e0e0
Для тем, основанных на Holo так же нужно указать некоторые параметры , чтобы не было проблем:
styles.xml




PS: Гарантированное применение темы произойдет при перезапуске приложения (а вообще при перезапуске активити, что происходит не всегда, так как они не обязательно уничтожаются при переходах)

Комментариев нет:

Отправить комментарий