1

管理返回堆栈目前Android应用程序的结构是android系统

Home 
    About us 
    Products 
    product1 
    product2 
    product3 
    Contact us 

是有侧面菜单,我可以直接访问该产品1,我现在的尝试是加入到堆栈中的每一笔交易,它有一个行为是很奇怪的

如果我进入这样的:

Home->product1->About us 

流动是我进入主页后,我点击侧边菜单中的产品1,输入p后在关于我们roduct1页面点击侧边菜单

第1次按返回键,它会回到产品1,但它应该去家

第二次按后退按钮,它会去家里,但它应该去产品页面

如何处理在这种情况下的后台堆栈?感谢您的帮助。

回答

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标志用于控制在堆栈中是否有多个条目。

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

0

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

如果您正在寻找可以让您回到父母活动的东西,比如产品X返回父产品屏幕,那么您可以使用向上按钮功能来定义这些东西。 Up Navigation from Android Dev Site

这样,您不必尝试清除和管理后退堆栈,只需定义将使用户返回到父屏幕的项目即可。