【问题标题】:Handle Fragment Backstack According to the Current Fragment根据当前 Fragment 处理 Fragment Backstack
【发布时间】:2019-06-29 07:20:16
【问题描述】:

问题 1

我有一个导航抽屉,我的大部分片段交易都是从这里发生的。 所以说我的抽屉里有 4 件物品,我正在从所有物品中进行交易。所以如果我在片段[A],现在我点击片段[B],我需要回到之前的片段,即[A]。但是,如果我继续单击打开片段[B] 的导航抽屉的Item B,我会继续将其添加到后台堆栈中,当我按下后退按钮时,我仍然在同一个片段中。

问题 2

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

【问题讨论】:

    标签: android android-fragments navigation-drawer


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2014-03-07
      • 2023-04-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      相关资源
      最近更新 更多