Вот сценарий:
У меня есть одна MainActivity, в которой размещено несколько фрагментов (HomeFragment, MyRecipesFragment, SavedFragment и SettingsFragment).
Внутри SettingsFragment, когда пользователь меняет тему, я вызываю
Код: Выделить всё
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);Это приводит к автоматическому воссозданию действия, как и ожидалось.
Однако проблема в следующем:
Когда действие воссоздается, пользовательский интерфейс на короткое время отображает HomeFragment (по умолчанию), а затем возвращается обратно к SettingsFragment.
Похоже, что нижняя панель навигации мигает на значок дома на 0,3 секунды, прежде чем вернуться к настройкам.
Вот мой упрощенный код MainActivity:
Код: Выделить всё
BottomNavigationView bottomNavigationView;
private static final String PREF_THEME = "Theme";
private static final String KEY_THEME_NAME = "ThemeName";
@Override
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences prefs = getSharedPreferences(PREF_THEME, MODE_PRIVATE);
int themeName = prefs.getInt(KEY_THEME_NAME, 0);
if (themeName == 0) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
} else if (themeName == 1) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
} else if (themeName == 2) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bottomNavigationView = findViewById(R.id.bottom_navigation);
if (savedInstanceState == null) {
loadFragment(new HomeFragment());
}
bottomNavigationView.setOnItemSelectedListener(item -> {
Fragment selected = null;
if (item.getItemId() == R.id.nav_home)
selected = new HomeFragment();
else if (item.getItemId() == R.id.nav_mine)
selected = new MyRecipesFragment();
else if (item.getItemId() == R.id.nav_saved)
selected = new SavedFragment();
else if (item.getItemId() == R.id.nav_settings)
selected = new SettingsFragment();
if (selected != null) loadFragment(selected);
return true;
});
}
private void loadFragment(Fragment fragment) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.frame_container, fragment)
.commit();
}
}
После изменения темы я хочу, чтобы приложение оставалось в SettingsFragment, не отображая HomeFragment и не сбрасывая выбор нижней навигации.
Фактическое поведение:
После смены темы (и автоматического повторного создания) на экране на короткое время отображается HomeFragment, а затем возвращается обратно к SettingsFragment.
Визуально нижняя навигация мигает, как если бы он повторно выбрал «Домой».
Для ясности прикреплю короткое видео, показывающее мерцание.
Если присмотреться, то сначала на короткое время выбирается вкладка «Рецепт», а затем после смены темы она сразу же переключается обратно на «Настройки».

Подробнее здесь: https://stackoverflow.com/questions/797 ... turning-to
Мобильная версия