Почему BottomNavigationView ненадолго переключается на HomeFragment, прежде чем вернуться в SettingsFragment после сменыAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему BottomNavigationView ненадолго переключается на HomeFragment, прежде чем вернуться в SettingsFragment после смены

Сообщение Anonymous »

Я столкнулся со странной проблемой мерцания пользовательского интерфейса в своем приложении для Android при использовании BottomNavigationView и переключении между светлым и темным режимами.
Вот сценарий:
У меня есть одна MainActivity, в которой размещено несколько фрагментов (HomeFragment, MyRecipesFragment, SavedFragment и SettingsFragment).
Внутри SettingsFragment, когда пользователь меняет тему, я вызываю

Код: Выделить всё

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
(или MODE_NIGHT_NO, в зависимости от выбора).
Это приводит к автоматическому воссозданию действия, как и ожидалось.
Однако проблема в следующем:
Когда действие воссоздается, пользовательский интерфейс на короткое время отображает 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»