有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从嵌套片段中的backstack中删除片段

我有一个main活动,其中添加了一个片段==>;利益碎片 在BenefintsFragment中有一个相对论

<RelativeLayout
        安卓:visibility="gone"
        安卓:background="@安卓:color/white"
        安卓:id="@+id/benefitContainer"
        安卓:layout_width="match_parent"
        安卓:layout_height="match_parent">


    </RelativeLayout>

我正在添加另一个片段,如

   browseBtn.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    RelativeLayout mLayout = (RelativeLayout) view.findViewById(R.id.benefitContainer);
                    mLayout.setVisibility(View.VISIBLE);
                    getChildFragmentManager().beginTransaction()
                            .add(R.id.benefitContainer, new ConfirmPinFragment()).commitNow();
                }
            });

在我新的ConfirmPinFragment中,我试图回到旧的BenefitsFragment作为

    backBtn.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    getChildFragmentManager().popBackStack();
                }
            });

但是,如果我尝试使用

        getChildFragmentManager().beginTransaction().remove(ConfirmPinFragment.this).commitNow();

它说

java.lang.IllegalStateException: FragmentManager is already executing transactions

共 (4) 个答案

  1. # 1 楼答案

    使用Kotlin和片段ktx使用这个:

    在你的毕业典礼上:

    implementation "androidx.fragment:fragment-ktx:$androidXFragmentKtxVersion"
    

    在你的片段中

    childFragmentManager
          .findFragmentByTag(YOUR_TAG)?.let { fragment ->
            childFragmentManager.commit(allowStateLoss = true) {
              remove(fragment)
            }
          }
    

    如果您没有使用childFragmentManager请使用requirectivity()。而是支持碎片化管理r

    requireActivity().supportFragmentManage
              .findFragmentByTag(YOUR_TAG)?.let { fragment ->
                requireActivity().supportFragmentManage.commit(allowStateLoss = true) {
                  remove(fragment)
                }
          }
    
  2. # 2 楼答案

    使用commitNow()时要小心,添加的片段不会添加到backstack中。有关更多信息,请参见answerthis blog post

    如果你想使用backstack,你应该使用commit()addToBackStack()而不是commitNow()

    commitNow()没有添加到backstack中的主要原因是commitNow()将同步执行事务,如果将其添加到backstack中,则如果存在另一个挂起的异步事务,事务可能会中断backstack顺序

  3. # 3 楼答案

    您可以使用FragmentManager pop方法从FragmentTransaction添加到back状态,并从Backback中删除:

    FragmentManager manager = getActivity().getSupportFragmentManager();
    FragmentTransaction trans = manager.beginTransaction();
    trans.remove(myFrag);
    trans.commit();
    manager.popBackStack();
    
  4. # 4 楼答案

    你需要做两件事才能让它起作用。但首先,真的没有必要commitNow()。您需要做的第一件事是在事务期间将要返回的片段添加到后堆栈中:

    browseBtn.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                RelativeLayout mLayout = (RelativeLayout) view.findViewById(R.id.benefitContainer);
                mLayout.setVisibility(View.VISIBLE);
                getChildFragmentManager().beginTransaction()
                        .add(R.id.benefitContainer, new ConfirmPinFragment())
                        .addToBackStack("benefits fragment").commit();
            }
        });
    

    当您返回时,请使用getFragmentManager()而不是getChildFragmentManager(),因为您实际上需要保存此片段的片段管理器。子片段管理器是管理该片段内片段的管理器

    backBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getFragmentManager().popBackStack();
            }
        });
    

    希望这有帮助