[英]Going from 3rd to 1st fragment in the backstack: Android
I have a sequence of event via which i have added three fragments to the backstack, one by one.我有一系列事件,通过这些事件,我将三个片段一个接一个地添加到 backstack 中。 Each of these fragments covers the full screen of the activity.
这些片段中的每一个都覆盖了活动的全屏。
I have stored the is returned from the commit of Frag1.我已经存储了从 Frag1 的提交返回的结果。
Now in Frag3, based on a specific click, I want to go back to Frag1 directly and discard/pop all Fragments in between.现在在 Frag3 中,基于特定的点击,我想直接回到 Frag1 并丢弃/弹出其间的所有 Fragment。
So, when this button is clicked i send a message to the activity which does the following:因此,当单击此按钮时,我会向执行以下操作的活动发送消息:
getSupportFragmentManager().popBackStack(mFrag1Id, FragmentManager.POP_BACK_STACK_INCLUSIVE);
But i just got a blank screen, so i assume no fragment was loaded.但我只是一个空白屏幕,所以我假设没有加载任何片段。
I even tried: In commit - fragmentTransaction.addToBackStack("Fragment1");
我什至尝试过:在提交中 -
fragmentTransaction.addToBackStack("Fragment1");
and then进而
getSupportFragmentManager().popBackStack("Fragment1", FragmentManager.POP_BACK_STACK_INCLUSIVE);
But it doesn't work.但它不起作用。 Could someone please help me with this?
有人可以帮我解决这个问题吗?
Thanks.谢谢。
OK so I found the issue.好的,所以我发现了问题。
FragmentManager.POP_BACK_STACK_INCLUSIVE
pops all the fragments including the one whose id passed as argument. FragmentManager.POP_BACK_STACK_INCLUSIVE
弹出所有片段,包括其 id 作为参数传递的片段。
SO for example:所以例如:
getSupportFragmentManager().popBackStack(mFrag1Id, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Here it will pop everything on the stack including fragment whose id id mFrag1Id.在这里,它将弹出堆栈上的所有内容,包括 id 为 mFrag1Id 的片段。
from third fragment you should call popBackStack();
从第三个片段你应该调用
popBackStack();
twice (one to remove third fragment and the second to remove second fragment )两次(一次删除第三个片段,第二个删除第二个片段)
android.support.v4.app.FragmentManager fm = getActivity().getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.remove(ThirdFragment.this);
transaction.commit();
fm.popBackStack();
fm.popBackStack();
When you opened Fragment A and you Navigated to Fragment B and then to Fragment C and then You want to close Fragment C and B and land on Fragment A当您打开Fragment A并导航到 Fragment B 然后导航到 Fragment C 然后您想关闭 Fragment C 和 B 并降落到 Fragment A 时
Now in some scenario, you want to close Fragment C and Fragment B and you want to land on Fragment A... then use this logic of FragmentManager to do such task.现在在某些情况下,您想关闭 Fragment C 和 Fragment B 并且您想降落在 Fragment A 上……然后使用 FragmentManager 的此逻辑来执行此任务。
so get using this所以开始使用这个
FragmentManager fmManager = activity.getSupportFragmentManager();
Log.e("Total Back stack Entry: ", fmManager.getBackStackEntryCount() + "");
Now assume, you want to close current fragment (Fragment C) and your last fragment (Fragment B) so simple logic is getBackStackEntryCount -2 and at that time your back stack entry count will be 3 (Fragment A, Fragment B and Fragment C)现在假设,你想关闭当前片段(片段 C)和你的最后一个片段(片段 B),所以简单的逻辑是 getBackStackEntryCount -2,那时你的返回堆栈条目计数将为 3(片段 A、片段 B 和片段 C)
Here -2 is for because we want to go 2 fragment step back (Fragment C and Fragment B)
这里 -2 是因为我们想要后退 2 个片段(片段 C 和片段 B)
So simple two line of Code is:这么简单的两行代码是:
if (fmManager.getBackStackEntryCount() > 0) {
fmManager.popBackStack(fmManager.getBackStackEntryAt(fmManager.getBackStackEntryCount()-2).getId(), FragmentMaanger.POP_BACK_STACK_INCLUSIVE);
}
You can also do it by adding two time "popBackStack()" and will also work, but it not idle way to do this您也可以通过添加两次“popBackStack()”来完成它,并且也可以工作,但它不是空闲的方式来做到这一点
FragmentManager fmManager = activity.getSupportFragmentManager();
fmManager.popBackStack();
fmManager.popBackStack();
If you want user to back at the beginning fragment, code snippet below will help you.如果您希望用户回到开头的片段,下面的代码片段将对您有所帮助。
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());
}
}
}
Also if you want to prevent user to close app when no fragments at back stack, take a look at below.另外,如果您想在后台堆栈中没有片段时阻止用户关闭应用程序,请查看下面的内容。
@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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.