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