Неправильно ли сохранять состояние фрагмента с помощью транзакций show / hide? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть 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());
}
...