如何从片段弹出片段


75

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

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

此外,是否有任何方法可以在后堆栈上更改片段的savedInstanceState?

我只是不知道如何使用模拟器在后堆栈上进行可靠的测试。


避免使用后堆栈!它并不能真正提高整体效率!使用普通的replace(),甚至每次导航时最好删除/添加!检查我在stackoverflow.com/questions/5802141/…上的
stack_ved 2014年

1
@stack_ved不是一个好主意。BackStacks是一件了不起的事情。顺便说一句,我看不到你的帖子。我猜它被否决了。:P
Sufian

Answers:


131

您可以按名称弹出片段。在将片段添加到后堆栈时,只需为其命名。

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

然后在Fragment_C中,使用名称即..弹出后台堆栈,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);
    }
});

12
即使我们在fm.popBackStack方法中也未传递任何参数,它也将起作用。fm.popBackStack();
凯拉斯2014年

如果要按后退按钮怎么办?
Akshay

1
@Akki,如果您使用添加到后退堆栈,则当您点击后退导航项时,它将已经弹出最后添加的片段。因此,无需执行任何常规步骤即可返回正常导航。仅当您要执行除正常的一步后退导航之外的其他操作时,才需要覆盖按下的后退按钮。
2014年

1
如果什么片段是第一个片段,然后addToBackStackreplace会造成问题。有没有办法做到这一点而无需致电addToBackStack
Hamzeh Soboh,2015年

4
根据文档,“到该状态的所有状态都会弹出”,而不仅仅是特定的片段。
Vahid Ghadiri

15

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

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


非常感谢你!在压倒了压迫之后,这确实帮助我回头了。我搜索了大约一个小时
KSDev '20年

1

第一次替换片段container_view的时候,我们添加名称,例如“ Later Transaction”

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

管理片段的后堆栈条目数的绝佳解决方案
Abhijit Rajmane,

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()
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.