在android中管理backstack

时间:2016-01-07 23:39:36

标签: android fragment back-stack fragmenttransaction fragment-backstack

目前Android应用程序的结构是

Home
   About us
   Products
     product1
     product2
     product3
   Contact us

由于有一个侧边菜单,我可以直接访问产品1,我当前的尝试是为每个事务添加到backstack,并且它的行为很奇怪

如果我这样说:

Home->product1->About us

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

第一次按下后退按钮,它将返回到product1,但它应该回家

第二次按下后退按钮,它将返回主页,但应该转到产品页面

如何在这种情况下处理后台堆叠?谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

当您在适当的时间更改片段和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中是否有多个条目。

当用户直接导航到详细信息页面时插入Product片段,您可能需要这样做。即:执行产品替换,然后替换产品详细信息。 希望这段代码片段和链接的帖子可以帮助您找到所需的解决方案。

答案 1 :(得分:0)

硬后退按钮将始终遍历堆栈,这是用户的预期行为。

如果您正在寻找可以将您带回父活动的内容,例如产品X返回到父产品屏幕,那么您可以使用向上按钮功能来定义。 Up Navigation from Android Dev Site

这样您就不必尝试清除和管理后台堆栈,只需定义将用户带回父屏幕的项目。