在 android 中管理后台堆栈
Manage the backstack in android
目前 android 应用程序的结构是
Home
About us
Products
product1
product2
product3
Contact us
因为有一个侧面菜单,我可以直接访问产品 1,我目前的尝试是为每笔交易添加到后台,它的行为很奇怪
如果我这样进入:
Home->product1->About us
流程是我进入首页后点击侧边菜单的product1,进入product1页面后点击侧边菜单的关于我们
第一次按下后退按钮,它会回到 product1,但它应该回到主页
第 2 次按后退按钮,它会回到首页,但应该会转到“产品”页面
遇到这种情况如何处理backstack?感谢您的帮助。
您需要在更改片段时变得聪明,并在适当的时候 popBackStack
以控制堆栈。这是我的一个应用程序的示例(也处理重用堆栈中的现有片段):
// Idea from
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
标志用于控制在后台堆栈中是否可以有多个条目。
至于在用户直接导航到详细信息页面时插入产品片段,您可能需要这样做。即:对产品执行替换,然后对产品详细信息执行替换。
希望此代码片段和链接的 post 将帮助您找到所需的解决方案。
硬后退按钮将始终遍历堆栈,这是用户预期的行为。
如果您正在寻找可以将您带回到父产品 activity 的东西,例如返回父产品屏幕的产品 X,您可以使用向上按钮功能定义它。 Up Navigation from Android Dev Site
这样您就不必尝试清除和管理返回堆栈,只需定义将用户带回父屏幕的项目。
目前 android 应用程序的结构是
Home
About us
Products
product1
product2
product3
Contact us
因为有一个侧面菜单,我可以直接访问产品 1,我目前的尝试是为每笔交易添加到后台,它的行为很奇怪
如果我这样进入:
Home->product1->About us
流程是我进入首页后点击侧边菜单的product1,进入product1页面后点击侧边菜单的关于我们
第一次按下后退按钮,它会回到 product1,但它应该回到主页
第 2 次按后退按钮,它会回到首页,但应该会转到“产品”页面
遇到这种情况如何处理backstack?感谢您的帮助。
您需要在更改片段时变得聪明,并在适当的时候 popBackStack
以控制堆栈。这是我的一个应用程序的示例(也处理重用堆栈中的现有片段):
// Idea from
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
标志用于控制在后台堆栈中是否可以有多个条目。
至于在用户直接导航到详细信息页面时插入产品片段,您可能需要这样做。即:对产品执行替换,然后对产品详细信息执行替换。 希望此代码片段和链接的 post 将帮助您找到所需的解决方案。
硬后退按钮将始终遍历堆栈,这是用户预期的行为。
如果您正在寻找可以将您带回到父产品 activity 的东西,例如返回父产品屏幕的产品 X,您可以使用向上按钮功能定义它。 Up Navigation from Android Dev Site
这样您就不必尝试清除和管理返回堆栈,只需定义将用户带回父屏幕的项目。