У меня есть Активность с пятью фрагментами, которые переключаются нажатием кнопки в BottomNavigationView
:
bottomNavigationView.setOnNavigationItemSelectedListener(item -> {
switch (item.getItemId()) {
case R.id.first:
replaceFragment(FIRST_TAG);
return true;
case R.id.other:
// last four fragments
default:
return false;
}
});
в replaceFragment:
private void replaceFragment(@NonNull String tag) {
if (!checkFragment(tag)) {
addFragment(getFragmentByTag(tag), tag);
}
showFragment(tag);
}
сheckFragment:
private boolean checkFragment(String tag) {
return fm.findFragmentByTag(tag) != null;
}
addFragment:
private void addFragment(Fragment fragment, String tag) {
if (!checkFragment(tag)) {
fm.beginTransaction().add(R.id.frame, fragment, tag).hide(fragment).commit();
}
}
showFragment:
private void showFragment(String tag) {
// currentFragmentTag defines as FIRST_TAG in fields block
currentFragment = fm.findFragmentByTag(currentFragmentTag);
FragmentTransaction transaction = fm.beginTransaction();
if (currentFragment != null) {
transaction.hide(currentFragment);
}
transaction
.attach(getFragmentByTag(tag))
.show(getFragmentByTag(tag))
.commit();
currentFragmentTag = tag;
}
Это было сделано, чтобы избежать загрузки данных во фрагменты каждый раз, когда фрагмент отображается! Все фрагменты добавляются в FragmentManager
только один раз, а позже появляются только вызовы hide (previousFragment) и show (nextFragment) .
Это хорошо работает!
Прежде чем приложение перейдет в фоновый режим и будет запущено новое тяжелое приложение. В фоновом режиме активность моего приложения уничтожается, и когда я возвращаюсь в приложение, отображается только BottomNavigationView
и пустой дисплей.
Я проверил в отладке. И FragmentManaget.getActiveFragments()
возвращает список из пяти фрагментов.
Итак, активность восстановлена, FragmentManager
восстановлена, FragmentManager
содержит фрагмент.
Почему фрагменты не отображаются на дисплее?