簡體   English   中英

從嵌套片段android中的backstack中刪除片段

[英]Remove fragment from backstack in nested fragments android

我有一個 MainActivity,其中添加了一個 Fragment ==> BenefitsFragment 在 BenefintsFragment 中有一個 RelativeLayout

<RelativeLayout
        android:visibility="gone"
        android:background="@android:color/white"
        android:id="@+id/benefitContainer"
        android:layout_width="match_parent"
        android: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();
                }
            });

但是這個popBackStack不起作用,如果我嘗試刪除使用

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

它崩潰說

java.lang.IllegalStateException: FragmentManager is already executing transactions

您需要做兩件事才能使其發揮作用。 但首先,確實不需要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();
        }
    });

希望這可以幫助。

使用commitNow()時要小心,您添加的片段不會被添加到 backstack 中。 有關更多信息,請參閱此答案此博客文章

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

commitNow()沒有添加到 backstack 的主要原因是 commitNow() 將同步執行事務,如果它會添加到 backstack 中,如果有另一個掛起的異步事務,則事務可能會破壞 backstack 順序。

您從 FragmentTransaction 添加到后台狀態並使用 FragmentManager pop 方法從后台移除:

FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove(myFrag);
trans.commit();
manager.popBackStack();

使用 Kotlin 和 fragment-ktx使用這個:

在你的gradle中:

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

在你的片段中

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

如果您不使用childFragmentManager,請改用requireActivity().supportFragmentManage r

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM