addToBackStack不起作用,关闭活动而不是弹出片段

时间:2013-05-15 09:40:33

标签: android android-fragments android-activity back-stack

我有一个问题,我无法在任何地方找到解决方案。

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

我有一个显示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始终为false,除非转换是从[3]到[4]。

如果我在每次转换中都将toBackStack传递给true,那么活动无论如何都会关闭。

1 个答案:

答案 0 :(得分:17)

我遇到了同样的问题。具体来说,我正在实现一个PreferenceFragment,我想让后退按钮将我返回到以前加载的片段。

“后堆栈”似乎不会通过 系统 后退按钮自动触发。我的解决方案是从 onBackPressed 覆盖手动弹出后台堆栈:

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

每当我导航到我的首选项片段时,我都会在活动中将 inSettings 布尔值设置为true以保留该状态。这是我的 backFromSettingsFragment 方法的样子:

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

因此,如果您能够跟踪Fragment [4]中的状态并截取后退按钮,您应该可以手动调用

getFragmentManager().popBackStack();

回到Fragment [3]。

注意:请记住,您需要将Fragment [3]添加到后台堆栈, Fragment [4]。 (除非[4]转到[5],你也需要回到[4]。)