【问题标题】:fragment transaction - pop backstack and then add fragment片段事务 - 弹出回栈然后添加片段
【发布时间】:2018-07-23 09:04:38
【问题描述】:

我正在尝试在 Android 片段中执行以下用例。我有2个片段。 片段 A -> 片段 B 当用户在 Fragment B 中执行某些操作时,我希望后堆栈如下 片段 A -> 片段 C。因此,当用户按下时,我希望用户返回片段 A。

我已经尝试了以下

mFragmentManager.popBackStackImmediate();
FragmentTransaction fragmentTransaction = fMgr.beginTransaction()
            .replace(R.id.base, Fragment_C, "1")
            .addToBackStack(null)
            .commitAllowingStateLoss();

这里的问题是,在显示片段 C 之前,我可以在短时间内看到片段 A

如果我执行以下操作

mFragmentManager.popBackStackImmediate();
FragmentTransaction fragmentTransaction = fMgr.beginTransaction()
            .replace(R.id.base, Fragment_C, "1")
            .addToBackStack(null)
            .commitNowAllowingStateLoss();

我得到了错误

此事务已被添加到后台堆栈

如果我这样做,我可以让片段 C 出现但是

mFragmentManager.popBackStackImmediate();
FragmentTransaction fragmentTransaction = fMgr.beginTransaction()
            .replace(R.id.base, Fragment_C, "1")
            .commitNowAllowingStateLoss();

这可行,我看不到片段 A 和片段 C,但后退按钮将用户带出应用程序。那么,是否有可能我们可以弹出片段的返回堆栈,然后将另一个片段添加到返回堆栈而不显示片段 A 并且后退按钮将用户带回片段 A

【问题讨论】:

    标签: android android-fragments fragmenttransaction


    【解决方案1】:

    这是一种将片段添加到片段或片段中的适配器的简单方法...

    1. 从您的基本活动中,将您的片段管理器设为静态。假设此活动称为仪表板。

      static FragmentManager support;
      
    2. 不要忘记在 onCreate 中初始化它。

      @Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.layout_dashboard);
      support = getSupportFragmentManager();
      
    3. 在适配器或片段中定义新片段。

      users_item_fragment dialog = new users_item_fragment();
      //also, let's add some data...
      Bundle args = new Bundle();
      args.putString("device", devicesList.get(position));
      
    4. 使用以下方法轻松将片段添加到您想要的任何位置

      //pick an easily remembered tag
      public void replace(Fragment fragment, String tag){
       FragmentManager man = dashboard.support;
       FragmentTransaction fragt = man.beginTransaction();
      
       if(!fragment.isAdded()) {
          dashboard.lastTag = dashboard.fragtag;//not needed, but helpful w/ backpresses
          fragt.add(R.id.fragment_container, fragment, tag)
                  .hide(man.findFragmentByTag(fragtag)).commit();
          dashboard.fragtag = dashboard.tag;//not needed, but helpful w/ backpresses
       }
       if(fragment.isAdded() && fragment.isHidden()) {
          dashboard.lastTag = dashboard.fragtag;//not needed, but helpful w/ backpresses
          fragt.show(fragment);
          fragt.hide(man.findFragmentByTag(fragtag)).commit();
          dashboard.fragtag = dashboard.tag;//not needed, but helpful w/ backpresses
       }
      }
      
    5. 要实现此功能并让后按正常工作,请将其添加到您的主要活动的 onBackPress 方法中:

      @Override
      public void onBackPressed() {
          FragmentManager man = getSupportFragmentManager();
          FragmentTransaction fragmentTransaction = man.beginTransaction();
          fragmentTransaction.hide(getSupportFragmentManager().findFragmentByTag(fragtag))
          .show(getSupportFragmentManager().findFragmentByTag(lastTag)).commit();
          fragtag = lastTag;// holds the last fragment
      
      }
      }
      

    这里的逻辑很容易看到,并且使用它很容易操作后按事件。

    【讨论】:

      猜你喜欢
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多