【问题标题】:addToBackStack doesn't work, closes the activity instead of popping back fragmentsaddToBackStack 不起作用,关闭活动而不是弹出片段
【发布时间】:2013-05-15 09:40:33
【问题描述】:

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

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

我有一个显示 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。

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

【问题讨论】:

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


    【解决方案1】:

    我遇到了同样的问题。具体来说,我正在实现一个 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]。)

    【讨论】:

    • 所以与其在 Activity 中保持状态,不如在 onBackPressed() if(getFragmentManager().getBackStackEntryCount() > 0) getFragmentManager().popBackStack();
    猜你喜欢
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    相关资源
    最近更新 更多