【问题标题】:Fragment back-stack management on androidandroid上的Fragment back-stack管理
【发布时间】:2015-04-13 13:48:26
【问题描述】:

我有几个片段。它们使用滑入式动画进行过渡。 MainFragment-> Fragment2 -> Fragment3。

1) 我想在用户到达 MainFragment 时清除 backstack,只留下堆栈中的那个片段。

2) 在某些情况下,我想删除堆栈中的前一项。当用户按下返回按钮并从 fragment3 = > fragment2 移动时说。

我在下面展示了我的代码。如果我使用该方法,片段过渡动画就会变得混乱。我不确定如何实现第二个要求。

另一个问题是,当我从 backstack 中删除片段时,它们会被丢弃吗?

private void replace(Fragment fragment )    
{
if(fragment == null) return;

            FragmentTransaction fragmentTransaction = fragmentManager
                    .beginTransaction();
            fragmentTransaction.setCustomAnimations(R.anim.fragment_enter,
                    R.anim.fragment_exit);

            fragmentTransaction.replace(R.id.fragment, fragment);
            fragmentTransaction.addToBackStack(fragment.toString());

            fragmentTransaction.commit();


            if(fragment instanceof MainFragment)
                clearBackStack();
}

public void clearBackStack() {

        if (fragmentManager.getBackStackEntryCount() > 0) {
            FragmentManager.BackStackEntry first = fragmentManager.getBackStackEntryAt(0);
            fragmentManager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }
    }

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    也许我理解错了,比你想象的要简单。这里我调用FragmentTransactionadd方法。来自 Google 示例代码 @Fragments 并使用您的代码作为示例:

    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    
    // and add the transaction to the back stack
    transaction.add(R.id.fragment, fragment3);
    transaction.addToBackStack(fragment3.toString());
    
    // Commit the transaction
    transaction.commit();
    

    注意:add 方法不会像之前的 Fragment 一样替换/删除 Fragment2。使用或添加 fragment2 后使用 fragment3 调用transaction.add。因此返回键会在显示fragment3时显示fragment2。

    【讨论】:

    • 基于您的参考“例如,这里是如何用另一个片段替换一个片段,并在后台堆栈中保留以前的状态:”我认为我需要使用替换。
    • @pats,在您的情况下,您最好调用 add 方法,如上所述。我把参考作为很好的文档和比较。如果在使用或添加 fragment2 后“添加”fragment3,则返回键将显示 fragment2。我会更新我的笔记以说明这一点。
    • 感谢您的建议,我厌倦了 add(),但它并没有改变片段。它卡在 MainFragment 上。我的目标是,当我们从任何路径到达 Mainfragment 时,必须清除整个后台堆栈。但是片段传统应该按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多