86

我有一个活动 A,它调用片段 Bf,它调用片段 Cf。我希望在调用 Cf 时将 Bf 放在后台堆栈中,以便用户可以导航回它。但是,如果在 Cf 中按下特定按钮,我希望将 Bf 从后台堆栈中删除。这可能吗?

我看到有一个 popBackStack() 函数。但是,我对这将如何工作感到有些困惑。使用此功能是否安全?是否有可能在后台堆栈的 Bf 之后插入来自不同应用程序的活动?

另外,有什么方法可以改变 backstack 上片段的 savedInstanceState 吗?

我只是不知道如何使用模拟器对 backstack 进行健壮的测试。

4

4 回答 4

141

您可以按名称弹出片段。在将片段添加到后台堆栈时,只需给它们一个名称。

fragmentTransaction.addToBackStack("fragB");
fragmentTransaction.addToBackStack("fragC");

然后在 Fragment_C 中,使用名称 ie.. 弹出回栈fragB并包含POP_BACK_STACK_INCLUSIVE

someButtonInC.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        FragmentManager fm = getActivity()
                .getSupportFragmentManager();
        fm.popBackStack ("fragB", FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
});
于 2013-02-20T06:25:45.747 回答
23

从 BackStack 中弹出 Fragment 的三种方法

只需添加以下任何行:

1)

getActivity().getSupportFragmentManager().popBackStack();

2)

getActivity().getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

3)

getActivity().getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

它们都是从 Backstack 中弹出片段的简单方法

于 2018-07-30T07:10:47.537 回答
1

首先替换片段container_view,那时我们添加名称,如“后期交易”

   getSupportFragmentManager().beginTransaction().replace(R.id.container_view, 
    profileFragment, "Profile").addToBackStack("Later Transaction").commit();

然后在后面按下按钮使用后来的事务名称弹出返回堆栈

     int count = getSupportFragmentManager().getBackStackEntryCount();
    if(count > 1) {
     getSupportFragmentManager().popBackStack("Later Transaction", 
     FragmentManager.POP_BACK_STACK_INCLUSIVE);
    } else {
        DialogUtils.show(HomeActivity.this, 
        getString(R.string.exit_app_message), getString(R.string.alert), 
       "Yes","No", new DialogUtils.ActionListner() {
            @Override
            public void onPositiveAction() {
                finish();
            }
            @Override
            public void onNegativeAction() {
            }
        });
    }
于 2018-10-27T11:39:10.510 回答
0

这是使用弹出最后一个片段的示例BackStackEntry

val manager = supportFragmentManager
try {
    // get last entry (you can get another if needed)
    val entry = manager.getBackStackEntryAt(manager.backStackEntryCount - 1)
    // you can pop it by name
    manager.popBackStack(entry.name, FragmentManager.POP_BACK_STACK_INCLUSIVE)
    // or pop by id
    manager.popBackStack(entry.id, FragmentManager.POP_BACK_STACK_INCLUSIVE)
} catch (ex: Exception) {
    ex.printStackTrace()
}
于 2020-06-01T13:42:40.413 回答