【问题标题】:Going from 3rd to 1st fragment in the backstack: Android从 backstack 中的第 3 个片段到第 1 个片段:Android
【发布时间】:2020-03-27 05:48:34
【问题描述】:

我有一个事件序列,通过它我将三个片段一个一个地添加到后台堆栈。这些片段中的每一个都覆盖了活动的全屏。

我已经存储了从 Frag1 的提交返回的。

现在在 Frag3 中,基于特定的点击,我想直接返回到 Frag1 并丢弃/弹出其间的所有 Fragment。

因此,当单击此按钮时,我会向执行以下操作的活动发送消息:

getSupportFragmentManager().popBackStack(mFrag1Id, FragmentManager.POP_BACK_STACK_INCLUSIVE);

但我只是得到一个空白屏幕,所以我假设没有加载任何片段。

我什至尝试过: 提交中 - fragmentTransaction.addToBackStack("Fragment1"); 然后

getSupportFragmentManager().popBackStack("Fragment1", FragmentManager.POP_BACK_STACK_INCLUSIVE);

但它不起作用。 有人可以帮我解决这个问题吗?

谢谢。

【问题讨论】:

  • 我猜你得给popBackStack()打两次电话。尝试调试,Fragments 真的很烂:)
  • 我同意,但有人可能对此有意见?
  • @agamov,你帮帮我!
  • @offset 不客气!

标签: android android-fragments back-stack


【解决方案1】:

好的,所以我发现了问题。

FragmentManager.POP_BACK_STACK_INCLUSIVE 弹出所有片段,包括其 id 作为参数传递的片段。

例如:

getSupportFragmentManager().popBackStack(mFrag1Id, FragmentManager.POP_BACK_STACK_INCLUSIVE);

这里它将弹出堆栈中的所有内容,包括 id 为 mFrag1Id 的片段。

【讨论】:

  • 如何获取 fragmentID,我已经通过这种方式添加了片段。 val fragmentTransaction = supportFragmentManager.beginTransaction() fragmentTransaction.add(id, fragment, tag) fragmentTransaction.addToBackStack(null) fragmentTransaction.commit()
【解决方案2】:

从第三个片段你应该调用popBackStack(); 两次(一次删除第三个片段,第二次删除第二个片段)

android.support.v4.app.FragmentManager fm = getActivity().getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.remove(ThirdFragment.this);
transaction.commit();
fm.popBackStack();
fm.popBackStack();

【讨论】:

    【解决方案3】:

    当您打开 Fragment A 并导航到 Fragment B,然后导航到 Fragment C,然后您想关闭 Fragment C 和 B 并降落在 Fragment A

    现在在某些情况下,你想关闭 Fragment C 和 Fragment B 并且你想降落在 Fragment A 上......然后使用 FragmentManager 的这个逻辑来完成这样的任务。

    1. 首先获取返回堆栈中的片段条目数(当我们向 addToBackStack("Frag1") 添加任何片段时),此时片段返回堆栈条目会增加。

    所以开始使用这个

    FragmentManager fmManager = activity.getSupportFragmentManager();
    Log.e("Total Back stack Entry: ", fmManager.getBackStackEntryCount() + "");
    

    现在假设,您要关闭当前片段(片段 C)和最后一个片段(片段 B),所以简单的逻辑是 getBackStackEntryCount -2,那时您的返回堆栈条目计数将为 3(片段 A、片段 B 和片段 C)

    这里的 -2 是因为我们想往后退 2 个片段(片段 C 和片段 B)

    那么简单的两行代码就是:

    if (fmManager.getBackStackEntryCount() > 0) {
    fmManager.popBackStack(fmManager.getBackStackEntryAt(fmManager.getBackStackEntryCount()-2).getId(), FragmentMaanger.POP_BACK_STACK_INCLUSIVE);
    }
    

    你也可以通过添加两次“popBackStack()”来做到这一点,并且也可以,但它不是空闲的方式来做到这一点

    FragmentManager fmManager = activity.getSupportFragmentManager();
    fmManager.popBackStack();
    fmManager.popBackStack();
    

    【讨论】:

      【解决方案4】:

      如果您希望用户回到开始的片段,下面的代码 sn-p 将帮助您。

      public static void popBackStackInclusive(AppCompatActivity activity) {
      
          FragmentManager fragmentManager = activity.getSupportFragmentManager();
      
          for (int i = 1; i < fragmentManager.getBackStackEntryCount(); i++){
              try {
                  int fragmentId = fragmentManager.getBackStackEntryAt(i).getId();
                  fragmentManager.popBackStack(fragmentId, FragmentManager.POP_BACK_STACK_INCLUSIVE);
              } catch (Exception e) {
                  Timber.d("Fragment Back Stack Error: %s", e.getLocalizedMessage());
              }
          }
      
      }
      

      另外,如果你想防止用户在后台没有碎片时关闭应用程序,请看下面。

      @Override
      public void onBackPressed() {
          FragmentManager fragmentManager = getSupportFragmentManager();
      
          if(fragmentManager.getBackStackEntryCount() > 1) {
              super.onBackPressed();
          } else {
              // TODO: Show dialog if user wants to exit app or;
              //finish();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-30
        • 2014-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多