Обрабатывать фрагмент Backstack в соответствии с текущим фрагментом - PullRequest
1 голос
/ 29 июня 2019

Задача 1

У меня есть Навигационный ящик, и большинство моих операций с фрагментами происходит отсюда. Скажем, у меня в ящике 4 предмета, и я делаю транзакцию со всех из них. Поэтому, если я нахожусь на фрагменте [A] и теперь я нажимаю на фрагмент [B], мне нужно вернуться к предыдущему фрагменту, т.е. [A]. Но если я продолжаю нажимать на Item B в блоке навигации, который открывает фрагмент [B], я продолжаю добавлять его в backstack, и когда я нажимаю кнопку возврата, я все еще на том же фрагменте.

Задача 2

Как мне добиться поведения Clear Top, которое используется для намерений фрагментов. Поскольку намерения могут очищать действия из стека только сверху, я хочу добиться того же поведения.

1 Ответ

0 голосов
/ 29 июня 2019

Решение задач 1 и 2 Идея:

Создать интерфейс, скажем FragmentInstanceHandler

public interface FragmentInstanceHandler {
   public void openFragment(Fragment fragment, String fragmentTag);
}

Создайте BaseFragment, как показано ниже, и распространите его на все ваши Fragment классы:

public BaseFragment extends Fragment {
   public FragmentInstanceHandler fragmentInstanceHandler;
   public void setFragmentInstanceHandler(FragmentInstanceHandler fragmentInstanceHandler) {
       this.fragmentInstanceHandler = fragmentInstanceHandler;
   }
}

Реализуйте интерфейс FragmentInstanceHandler к Activity, в котором вы собираетесь открыть все фрагменты. Допустим, Activity это MainActivity:

public MainActivity extends Activity implements FragmentInstanceHandler {
  private BaseFragment currentFragment;
  @Override
  public void openFragment(BaseFragment fragment, String fragmentTag) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment oldFragmentInstance = fragmentManager .findFragmentByTag(fragmentTag);
        boolean fragmentPopped = fragmentManager.popBackStackImmediate (fragmentTag, 0);
   if (!fragmentPopped && oldFragmentInstance == null) {
        fragment.setFragmentInstanceHandler(this);       
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.container, fragment, fragmentTag);
        fragmentTransaction.addToBackStack(fragmentTag);
        fragmentTransaction.commit();
        currentFragment = fragment;
    } else if(fragmentPopped ){
        currentFragment = oldFragmentInstance;
     }
     if(mDrawerLayout!= null)
           mDrawerLayout.closeDrawers();
 }

}

Теперь, когда вы хотите открыть новый Fragment даже из любого другого Fragment, вы можете вызывать метод, как показано ниже. Рекомендуется предоставить новый тег , если вы хотите иметь новый экземпляр того же самого Fragment

fragmentInstanceHandler.openFragment(new MyFragment(), "FragmentNewInstance");

Вы можете настроить FragmentInstanceHandler, чтобы добавить собственный метод для замены текущего Fragment вместо добавления. Приведенное выше решение просто дает вам представление о том, как вы можете достичь своего решения, разместив и управляя всем своим кодом из одного места.

...