简体   繁体   English

从后台堆栈中的第 3 个片段到第 1 个片段:Android

[英]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 的此逻辑来执行此任务。

  1. First get the number of fragment entries in back stack (When we are adding any fragment to addToBackStack("Frag1")) at that time fragment back stack entry will increase.首先获取返回堆栈中的片段条目数(当我们向 addToBackStack("Frag1") 添加任何片段时),此时片段返回堆栈条目将增加。

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.

相关问题 从第三项活动转到第一项活动 - Going from 3rd Activity to 1st Activity 从3rdfragment选项卡过渡到2nd / 1stfragment选项卡,中断了应用程序 - Transition from 3rd fragment tab to 2nd/1st fragment tab , breaks the app 在 android 中将数据从第一个选项卡传递到第三个选项卡活动时获取 null object 引用 - Getting null object reference when passing data from 1st tab to 3rd tab activity in android 如何将价值从第一个活动传递到第三个活动 - How to pass value from 1st activity to 3rd activity 如何从活动第3过渡到第1? - How to transition from activity 3rd to 1st? 从第一活动到第三活动的变量值传递 - Passing value of a variable from 1st activty to 3rd activity 将清单从第一个活动传递到第三个活动 - Passing List from 1st activity to 3rd activity Android-如何在第一和第三活动之间切换? - Android - How do I switch between 1st and 3rd activities? 如何获得有关按钮单击第一活动的信息并在第三活动中使用它的信息? -安卓 - How to get information about a button click on 1st activity and use it in the 3rd activity? - android 从第3个Activity调用setResult时,将数据返回第一个Activity - Returning data back to 1st Activity when setResult is called from 3rd Activity
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM