popBackStack
当您更改片段时以及在适当的时间控制堆栈时,您需要很聪明。这是我的一个应用程序中的一个示例(也处理重用堆栈中的现有片段):
// Idea from http://stackoverflow.com/questions/18305945/how-to-resume-fragment-from-backstack-if-exists
private void setPrimaryContentFragment(BaseFragment fragment, boolean allowStack){
final String backStackName = fragment.getBackStackName();
final FragmentManager manager = getSupportFragmentManager();
final boolean fragmentPopped = manager.popBackStackImmediate(backStackName, 0);
if (!fragmentPopped) { //fragment not in back stack, create it.
if (!allowStack && manager.getBackStackEntryCount() > 1) {
manager.popBackStack(manager.getBackStackEntryAt(0).getId(), 0);
}
final FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.primary_content, fragment);
transaction.addToBackStack(backStackName);
transaction.commit();
try {
manager.executePendingTransactions();
} catch (IllegalStateException exception) {
// Move along as this will be resolved async
}
}
}
该getBackStack()
方法在我的基本片段中实现,并具有以下默认实现:
public String getBackStackName() {
return getClass().getName();
}
该allowStack
标志用于控制是否可以在后台堆栈中存在多个条目。
至于在用户直接导航到详细信息页面时插入 Product 片段,您可能需要这样做。即:对产品执行替换,然后对产品详细信息执行替换。希望此代码段和链接的帖子将帮助您提出所需的解决方案。