addToBackStack无效,关闭了activity而不是弹出fragment

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

当转换是从[3]到[4]时,toBackStack始终为false。

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

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

回到 Fragment [3]。

注意:记得将 Fragment [3] 添加到返回堆栈中,而不是 Fragment [4]。(除非 [4] 去到 [5] 并且你也需要返回到 [4]。)


3
与其在Activity中保存状态,不如在onBackPressed()方法中进行操作。如果(getFragmentManager().getBackStackEntryCount() > 0),则执行getFragmentManager().popBackStack()。 - toidiu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接