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

问题描述 投票:0回答:5

我有一个事件序列,通过它我将三个片段一个一个地添加到后台。这些片段中的每一个都覆盖了活动的整个屏幕。

我已经存储了从 Frag1 的提交返回的。

现在在 Frag3 中,基于特定的点击,我想直接返回到 Frag1 并丢弃/弹出其间的所有 Fragment。

因此,当单击此按钮时,我会向执行以下操作的活动发送一条消息:

getSupportFragmentManager().popBackStack(mFrag1Id, FragmentManager.POP_BACK_STACK_INCLUSIVE);

但是我只有一个空白屏幕,所以我假设没有加载任何片段。

我什至试过: 提交 -

fragmentTransaction.addToBackStack("Fragment1");
然后

getSupportFragmentManager().popBackStack("Fragment1", FragmentManager.POP_BACK_STACK_INCLUSIVE);

但是没用。 有人可以帮我吗?

谢谢。

android android-fragments back-stack
5个回答
12
投票

好的,所以我发现了问题。

FragmentManager.POP_BACK_STACK_INCLUSIVE
弹出所有片段,包括其 id 作为参数传递的片段。

例如:

getSupportFragmentManager().popBackStack(mFrag1Id, FragmentManager.POP_BACK_STACK_INCLUSIVE);

这里它将弹出堆栈中的所有内容,包括 id 为 mFrag1Id 的片段。


8
投票

当您打开片段A并导航到片段B然后导航到片段C然后您想关闭片段C和B并登陆片段A

现在在某些情况下,你想关闭 Fragment C 和 Fragment B,你想登陆 Fragment A...然后使用 FragmentManager 的这个逻辑来完成这样的任务。

  1. 首先获取返回堆栈中的片段条目数(当我们将任何片段添加到 addToBackStack("Frag1") 时)此时片段返回堆栈条目将增加。

所以开始使用这个

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();

7
投票

从第三个片段你应该调用

popBackStack();
两次(一次删除第三个片段,第二次删除第二个片段)

android.support.v4.app.FragmentManager fm = getActivity().getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.remove(ThirdFragment.this);
transaction.commit();
fm.popBackStack();
fm.popBackStack();

0
投票

如果你想让用户回到开始的片段,下面的代码片段会帮助你。

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();
    }
}

0
投票

当用户去[1] > [2] > [3]

那么

onBackPress
用户将是 [3] > [1].

添加您不想在 backPress 中显示的片段。不管你有多少碎片。你可以弹出任何两个片段之间的任何片段

按照里面的这两个步骤[第二]片段:你想要

popUp/close

Step1. 只需在

fragmentManager.popBackStack();
之前添加
fragmentTransaction
表示调用
[3] fragment
(在这一行之后, 它销毁/弹出第二个片段并在打开之前再次打开第一个片段 第 3 个片段。这意味着当用户按下第三个片段上的后退按钮时。 然后在最近的片段中,有第一个片段而不是第二个)
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();
            }
        });

        //....
    }

(^_^) 快乐编码

© www.soinside.com 2019 - 2024. All rights reserved.