У меня есть bottomNavigationView с пятью вкладками, которые перемещают пользователя между пятью фрагментами. Я хочу, чтобы состояние четырех из них сохранялось одновременно, например, когда пользователь переходит к фрагменту B и возвращается к фрагменту A, тогда фрагмент A должен быть точно таким же, как он его покинул. Сначала я использовал android компоненты навигации, но он не поддерживает несколько стеков, поэтому я удалил его и использовал популярные транзакции фрагментов.
Вот что я сейчас делаю:
- В моей деятельности есть переменная memeber 'activeFragment', которая инициализируется как основной фрагмент, который пользователь видит при входе в операцию, и обновляется, когда пользователь переходит к другому фрагменту
Когда пользователь переходит к фрагменту я скрываю текущий активный фрагмент и показываю фрагмент, связанный с выбранной вкладкой (если этот фрагмент еще не создан, я создаю его первым), используя:
getSupportFragmentManager().beginTransaction().hide(activeFragment).show(toFragment);
Это работает просто отлично, единственное странное поведение состоит в том, что фрагменты не получают обычные обратные вызовы жизненного цикла, например, когда я перемещаюсь к фрагменту. Он не вызывает onResume, когда я нажимаю кнопку «домой» и возвращаюсь к действию, все фрагменты получают ' onResume ', что немного неловко.
Итак, это безопасный подход к go по этому поводу? Есть ли лучший способ сделать это? С какой стати у android нет готового способа сделать это, учитывая, что многие приложения, которые реализуют эту функцию, даже ее приложение Google Play Store реализует ее?
Редактировать: Вот как я навигация между фрагментами:
private void moveToFragment(MenuItem fragmentNavItem) {
//Get toFragment given its id
int id = fragmentNavItem.getItemId();
FragmentManager fragmentManager = getSupportFragmentManager();
String tag = getFragmentTagFromItemId(id);
Fragment toFragment = fragmentManager.findFragmentByTag(tag);
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.hide(activeFragment);
if (toFragment == null) {
//We go to this fragment for the first time
toFragment = createFragmentFromItemId(id);
transaction.add(R.id.frame_layout_main, toFragment, tag);
} else {
//We have been in this fragment before
transaction.show(toFragment);
}
transaction.commit();
activeFragment = toFragment;
toolbar.setTitle(fragmentNavItem.getTitle());
}