我有一个活动A,该活动称为片段Bf,该活动称为片段Cf。我希望在调用Cf时将Bf放在后台,以便用户可以导航回去。但是,如果在Cf中按下了特定的按钮,我希望将Bf从后堆栈中删除。这可能吗?
我看到有一个popBackStack()函数。但是,我对如何工作感到有些困惑。使用此功能安全吗?是否有可能将不同应用程序的活动插入Bf之后的Backstack中?
此外,是否有任何方法可以在后堆栈上更改片段的savedInstanceState?
我只是不知道如何使用模拟器在后堆栈上进行可靠的测试。
我有一个活动A,该活动称为片段Bf,该活动称为片段Cf。我希望在调用Cf时将Bf放在后台,以便用户可以导航回去。但是,如果在Cf中按下了特定的按钮,我希望将Bf从后堆栈中删除。这可能吗?
我看到有一个popBackStack()函数。但是,我对如何工作感到有些困惑。使用此功能安全吗?是否有可能将不同应用程序的活动插入Bf之后的Backstack中?
此外,是否有任何方法可以在后堆栈上更改片段的savedInstanceState?
我只是不知道如何使用模拟器在后堆栈上进行可靠的测试。
Answers:
您可以按名称弹出片段。在将片段添加到后堆栈时,只需为其命名。
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);
}
});
addToBackStack
用replace
会造成问题。有没有办法做到这一点而无需致电addToBackStack
?
从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);
它们都是从片段弹出片段的简单方法
第一次替换片段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() {
}
});
}
这是使用以下命令弹出最后一个片段的示例 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()
}