Страницы

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

пятница, 20 декабря 2019 г.

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

#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);

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

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