Общие ссылки, темы и кнопка «Назад» для Android

#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 () решит вашу проблему с обратной навигацией.