#android #themes #sharedpreferences #back-button
#Android #темы #общие настройки #кнопка «Назад»
Вопрос:
У меня есть простое действие с темой, установленной через setTheme (), идентификатор темы сохраняется в SharedPreferences, я получаю эти данные и setTheme () перед super.onCreate() в основном действии. При нажатии кнопки меню я могу запустить действие настроек. При обновлении настроек и нажатии кнопки «Назад» для возврата к основному действию тема не обновляется до новой настройки. Это исправляется только закрытием приложения и повторным открытием.
Каков наилучший способ обновить основное действие и перезагрузить тему после нажатия кнопки «Назад» в операции «Настройки»? Я попытался поместить setTheme () в onResume, но безрезультатно.
Любая помощь приветствуется,
Спасибо, Рик
Ответ №1:
Смотрите эту страницу:
По словам Дайанн Хакборн, инженера по фреймворку Android:
Вы можете установить тему только во время создания. Чтобы применить тему, весь пользовательский интерфейс необходимо повторно надуть и перестроить из его ресурсов.
Ответ №2:
Если нет другого способа, вы могли бы сделать что-то подобное в своей деятельности после обновления настроек:
Intent i = new Intent(this, YourActivity.class);
startActivity(i);
finish();
Это не слишком элегантно, и я надеюсь, что есть более простой способ.
Ответ №3:
и установите Theme() перед super.onCreate() в основном действии
Вы никогда не должны помещать какой-либо код перед super.onCreate () или super.onResume(), весь ваш код должен быть размещен после этих вызовов. Возможно, это проблема.
Ответ №4:
зарегистрируйте прослушиватель onsharedpreferencechange в своей активности
Комментарии:
1. Хотя это может быть ответом на вопрос, лучше включить объяснение того, почему это лучший способ ведения дел, и его преимуществ по сравнению с другими ответами.
2. внедрение onsharedpreferencechangelistener — самый простой способ обновления пользовательского интерфейса, и вторая важная вещь заключается в том, что разработчик сохраняет выбранную в данный момент тему в sharedprefernces
Ответ №5:
Вот как я это сделал:
У меня есть приложение, в котором на странице есть несколько тем на выбор. Обычно, когда выбирается тема, а затем нажимается кнопка «Назад», тема возвращается к предыдущей. Это проблема.
Я использовал трюк @Override для onBackPressed (), чтобы выполнить трюк. Ниже приведен код (я также изменил код для первого действия в стеке [мой навигационный ящик]).
@Override
public void onBackPressed()
{
Intent intent1 = new Intent(this, NavigationActivity.class);
startActivity(intent1);
super.onBackPressed(); // optional depending on your needs
}
Этот код в операции переключения темы сделал так, что обычный код кнопки «Назад» не вызывался для уничтожения текущего действия и возврата к старой теме. Это просто переходит к предыдущему действию, в котором участвовал пользователь, которое является my NavigationActivity. Настройте это по своему усмотрению.
Еще одна вещь, которую следует отметить, это то, что кнопка «Назад» может по-прежнему беспокоить вас даже после этого, потому что, как только она перейдет ко мне в NavigationActivity, если я снова нажму кнопку «Назад», тема будет возвращена. Я вызвал тот же метод, что и раньше, но я удалил super.onBackPressed();
инструкцию, которая и вызвала возврат. Вот как это выглядит:
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
}
}
Я надеюсь, что это поможет вам!
Ответ №6:
Если вы используете навигационный компонент, пожалуйста, попробуйте, как указано ниже. Не требуется вызывать intent или finishActivity.
override fun onBackPressed() {
when (navController.currentDestination?.id){
R.id.settingsFragment -> super.onSupportNavigateUp()
else -> super.onBackPressed()
}
}
super.onSupportNavigateUp () решит вашу проблему с обратной навигацией.