我有一个事件序列,通过它我将三个片段一个一个地添加到后台。这些片段中的每一个都覆盖了活动的整个屏幕。
我已经存储了从 Frag1 的提交返回的。
现在在 Frag3 中,基于特定的点击,我想直接返回到 Frag1 并丢弃/弹出其间的所有 Fragment。
因此,当单击此按钮时,我会向执行以下操作的活动发送一条消息:
getSupportFragmentManager().popBackStack(mFrag1Id, FragmentManager.POP_BACK_STACK_INCLUSIVE);
但是我只有一个空白屏幕,所以我假设没有加载任何片段。
我什至试过: 提交 -
fragmentTransaction.addToBackStack("Fragment1");
然后
getSupportFragmentManager().popBackStack("Fragment1", FragmentManager.POP_BACK_STACK_INCLUSIVE);
但是没用。 有人可以帮我吗?
谢谢。
好的,所以我发现了问题。
FragmentManager.POP_BACK_STACK_INCLUSIVE
弹出所有片段,包括其 id 作为参数传递的片段。
例如:
getSupportFragmentManager().popBackStack(mFrag1Id, FragmentManager.POP_BACK_STACK_INCLUSIVE);
这里它将弹出堆栈中的所有内容,包括 id 为 mFrag1Id 的片段。
当您打开片段A并导航到片段B然后导航到片段C然后您想关闭片段C和B并登陆片段A
现在在某些情况下,你想关闭 Fragment C 和 Fragment B,你想登陆 Fragment A...然后使用 FragmentManager 的这个逻辑来完成这样的任务。
所以开始使用这个
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();
从第三个片段你应该调用
popBackStack();
两次(一次删除第三个片段,第二次删除第二个片段)
android.support.v4.app.FragmentManager fm = getActivity().getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.remove(ThirdFragment.this);
transaction.commit();
fm.popBackStack();
fm.popBackStack();
如果你想让用户回到开始的片段,下面的代码片段会帮助你。
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();
}
}
当用户去[1] > [2] > [3]
那么
onBackPress
用户将是 [3] > [1].
添加您不想在 backPress 中显示的片段。不管你有多少碎片。你可以弹出任何两个片段之间的任何片段
按照里面的这两个步骤[第二]片段:你想要
popUp/close
Step1. 只需在
之前添加fragmentManager.popBackStack();
表示调用fragmentTransaction
。 (在这一行之后, 它销毁/弹出第二个片段并在打开之前再次打开第一个片段 第 3 个片段。这意味着当用户按下第三个片段上的后退按钮时。 然后在最近的片段中,有第一个片段而不是第二个)[3] fragment
Step2. 添加也用.addToBackStack(null)
fragmentTransaction
[2] Fragment:点击按钮,我们将打开
3rd fragment
.
{ //.....
//this code inside [2]nd fragment. onBackPress at [3] we want to close[2] between [3]>[1]
//on button click listener
view.findViewById(R.id.btnOpen3ndFrag).setOnClickListener(v -> {
if (getActivity() != null) {
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
//this .popBackStack will close this [2]nd fragment. before open 3rd fragment
fragmentManager.popBackStack(); //<<<Step1: add this before fragmentTransaction
//here we will open 3rd fragment
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, new ThirdFragment(), "FirstFragment")
.addToBackStack(null) //<<Step2: add this also.
.commit();
} else {
Toast.makeText(getActivity(), "Something went wrong", Toast.LENGTH_SHORT).show();
}
});
//....
}
(^_^) 快乐编码