【问题标题】:PopBackStack is not working properlyPopBackStack 无法正常工作
【发布时间】:2016-12-23 08:46:46
【问题描述】:

我的代码是这样的:

FragA >> FragB >> FragC >> FragD

当我按下 FragD 的 onBackpress() 时,它会直接转到 FragA,但我想让它继续运行 FragC。

此处为 BackPress 代码:

 if (getActivity().getSupportFragmentManager().getBackStackEntryCount() > 0) {
            back_btn.setVisibility(View.GONE);
            getActivity().getSupportFragmentManager().popBackStack();
        }

替换片段代码:

                       FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                       FragmentA fragmentA = new FragmentA();
                       fragmentTransaction.replace(R.id.framelayoutinner, fragmentA);
                       fragmentTransaction.addToBackStack("fragmentA");
                       fragmentTransaction.commit();



                       FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                       FragmentA fragmentB = new Fragmentb();
                       fragmentTransaction.replace(R.id.framelayoutinner_2, fragmentB);
                       fragmentTransaction.addToBackStack("fragmentB");
                       fragmentTransaction.commit();

【问题讨论】:

  • 你在做fragment事务的时候用过addtobackstack方法吗?
  • 如果您将分片交易添加到Backstack,则无需处理onBackPressed()中的Backstack。它将由托管片段的 Activity 负责。
  • 您使用的是两个容器吗? framelayoutinner 和 framelayoutinner_2
  • 如果您也添加 xml 布局会很有帮助。

标签: android android-fragments fragment


【解决方案1】:

您正在使用嵌套片段,如果您从另一个片段加载片段,那么它将成为嵌套结构。因此,请尝试检查您的 Root 片段中是否存在任何子片段,然后首先弹出该子片段。

为此使用getChildFragmentManager() 并进行递归调用,直到获得大多数幼儿片段(最后添加)。或者更好地在您的片段上使用标签

【讨论】:

    【解决方案2】:

    您需要使用 addToBackStack 方法将每个片段添加到 backstack 中

      public void setmFragmentContainer(Fragment fragment)
        {
            final String tag = fragment.getClass().getName();
            FragmentManager manager = getSupportFragmentManager();
            FragmentTransaction transaction = manager.beginTransaction();
            transaction.replace(R.id.layout_content, fragment, tag);
            transaction.addToBackStack(tag);
            transaction.commit();
        }
    

    这个方法可以帮到你

    【讨论】:

    • 没有声明他没有向backstack添加片段
    • 是的,我已将它添加到后台堆栈。
    • 是的,你是对的 Umar 但 addTobackstack 将帮助他在 fragmentmanager 中维护 Fragments 的 backstack
    • @Reena 你想要哪几行代码......在替换片段或回压时?
    • 替换片段
    猜你喜欢
    • 2014-05-29
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 2012-07-11
    • 2018-04-08
    • 2017-04-20
    • 2018-10-02
    相关资源
    最近更新 更多