11

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

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

我有一个显示 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] 的转换。

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

4

1 回答 1

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();

回到片段 [3]。

注意:请记住,您需要将 Fragment [3] 添加到后台堆栈,而不是Fragment [4]。(除非 [4] 转到 [5] 并且您还需要返回 [4]。)

于 2013-09-06T19:35:41.523 回答