2013-05-15 50 views
11

我有一个疑难问题,我无法在任何地方找到解决方案。addToBackStack不起作用,关闭活动而不是弹出碎片

当我按下后退按钮时,我的应用程序不会返回到上一个片段,而是关闭活动。

我有一个活动,显示4片段:[1],[2],[3],[4]。我可以在动作栏之间切换前3个片段,我不想将它们添加到后端堆栈。

片段[4]是在片段[3]中选择的项目的详细视图。当我按[4]时,我想返回片段[3],而不是关闭应用程序。

的过渡以这种方式由活动,其中片段放置完成:

private void replaceFragment(Fragment fragment, boolean toBackStack){ 

    if(fragment != null){ 

     FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
     fragmentTransaction.replace(R.id.container, fragment); 

     if(toBackStack) 
      fragmentTransaction.addToBackStack(null); 

     fragmentTransaction.commit(); 
    } 
} 

其中toBackStack是除了当过渡是从始终为假[3]〜[4]。

如果我在每个转换中都传递给BackStack为true,则该活动无论如何都会关闭。

回答

17

我有同样的问题。具体来说,我正在实现一个PreferenceFragment,并且我希望后退按钮将我返回到之前加载的片段。

看来,“回栈”的东西是不会自动与系统后退按钮触发。我的解决办法是手动弹出从后退堆栈onBackPressed覆盖:

@Override 
public void onBackPressed() 
{ 
    if (inSettings) 
    { 
     backFromSettingsFragment(); 
     return; 
    } 
    super.onBackPressed(); 
} 

每当我浏览到我的喜好片段,我设置了inSettings布尔为true活动,以保持该状态。这里是我的backFromSettingsFragment方法是这样的:

private void backFromSettingsFragment() 
{ 
    inSettings = false; 
    getFragmentManager().popBackStack(); 
} 

所以,如果你能够跟踪当你在片段的状态[4]和拦截返回按钮,你应该能够手动调用

getFragmentManager().popBackStack(); 

回到Fragment [3]。

注:请记住,你需要添加片段[3]后退堆栈,片段[4]。 (除非[4]去[5],你也需要回到[4]。)

+3

因此,而不是在活动中保持状态,它可能会更好地做到这一点onBackPressed() if(getFragmentManager ().getBackStackEntryCount()> 0) getFragmentManager()。popBackStack(); – toidiu