根据当前片段处理片段回栈

时间:2019-06-29 07:20:16

标签: android android-fragments navigation-drawer

问题1

我有一个导航抽屉,大部分片段交易都是从这里进行的。 假设我的抽屉里有4件物品,而我正在从所有物品中进行交易。因此,如果我在片段[A]上,现在我单击片段[B],则需要回到上一个片段,即[A]。但是,如果我继续单击打开片段Item B的导航抽屉中的[B],则会继续将其添加到Backstack中,并且当我按下Back按钮时,我仍然处于相同的片段中。 / p>

问题2

如何实现用于片段意图的Clear Top行为。由于意图只能从顶部清除堆栈中的活动,因此我想实现相同的行为。

1 个答案:

答案 0 :(得分:0)

问题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,您将在其中打开所有片段。假设ActivityMainActivity

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而不是添加。上面的解决方案只是让您了解如何通过从一个位置放置和管理所有代码来实现解决方案。