从片段导航到片段时出错了

时间:2016-06-18 22:30:48

标签: android android-fragments fragmentmanager

我有一个活动和3个片段 A,B,C 当应用程序启动时它保持主片段A 然后来自片段A 我&# 39; m导航到片段B ,从片段B 导航到片段C 。代码有效,它从片段B 打开片段C ,但首先打开片段A ,然后片段C 。为什么以及如何解决这个问题?我是否还需要一个活动来托管片段B,C?

切换片段的方法:

    private Fragment contentFragment;
     public void switchContent(Fragment fragment, String tag){
        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        while (fragmentManager.popBackStackImmediate());
        if (fragment != null){
            FragmentTransaction transaction = fragmentManager
                    .beginTransaction();
            transaction.replace(R.id.content_frame,fragment,tag);
            if (!(fragment instanceof FragmentB)){
                transaction.addToBackStack(tag);
            }
            transaction.addToBackStack(tag);
            transaction.commit();
            contentFragment = fragment;
        }
    }

R.id.content_frame 是布局的ID,用于活动 setContentView

1 个答案:

答案 0 :(得分:0)

发生这种情况是因为在将当前片段替换为下一片段之前,您将弹出后栈中的所有片段。

你不需要这一行:

while (fragmentManager.popBackStackImmediate());

此外,这部分毫无意义:

if (!(fragment instanceof FragmentB)){
    transaction.addToBackStack(tag);
}
transaction.addToBackStack(tag);

因为最后一行忽略了条件。

如果您希望将片段添加到除FragmentB之外的后台堆栈,请尝试下一步编辑您的代码:

public void switchContent(Fragment fragment, String tag) {
    if (fragment != null) {
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.content_frame, fragment, tag);
        if (!(fragment instanceof FragmentB)){
            transaction.addToBackStack(tag);
        }
        transaction.commit();
        contentFragment = fragment;
    }
}