![](/img/trans.png)
[英]Remove specefic fragment from backstack that is not on top of 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();
}
});
希望這可以幫助。
您從 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.