目前,Android应用的结构为

Home
   About us
   Products
     product1
     product2
     product3
   Contact us


因为有一个侧面菜单,我可以直接访问产品1,所以我当前的尝试是将每笔交易添加到Backstack,它的行为非常奇怪

如果我这样进入:

Home->product1->About us


流程是进入主页后,单击侧面菜单上的product1,进入product1页面后,单击侧面菜单上的关于我们

第一次按下返回按钮,它将返回到product1,但它应该返回首页

第二次按返回按钮,它将返回首页,但应转到“产品”页面

在这种情况下如何处理后备箱?感谢您的帮助。

最佳答案

在适当的时候更改片段和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标志用于控制Backstack中是否可以有多个条目。

至于在用户直接导航到详细信息页面时插入产品片段,您可能仅需要这样做。即:对产品执行替换,然后对产品详细信息执行替换。
希望此代码段和链接的文章将帮助您提出所需的解决方案。

10-04 14:09