IllegalStateException:已添加的片段未被 try-catch 捕获

IllegalStateException: Fragment already added not caught with try-catch

所以我有这个神奇的功能:

public static MenuPictureFragment newMenuPictureFragment(FragmentActivity fragmentActivity, String userIdParam, int containerId){
    MenuPictureFragment menuPictureFragment = (MenuPictureFragment) fragmentActivity.getSupportFragmentManager().findFragmentByTag(fragmentActivity.getString(R.string.fragment_tag_menu_picture_fragment));

    try {
        if(menuPictureFragment == null) {
            menuPictureFragment = MenuPictureFragment.newInstance(userIdParam);
        } 
        FragmentTransaction fragmentTransaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
        fragmentTransaction.add(containerId, menuPictureFragment, fragmentActivity.getString(R.string.fragment_tag_menu_picture_fragment));
        fragmentTransaction.commit();
    } catch (RuntimeException re){
        //intentionelly empty
    }

    return menuPictureFragment;
}

menuPictureFragment 是片段内的片段,如果我离开父片段,应用程序有时会崩溃并显示 IllegalStateException: Fragment already added 消息。

那个异常不应该被捕获吗?添加 !menuPictureFragment.isAdded() 也无济于事。

如果我用 fragmentTransaction.replace 替换 fragmentTransaction.add 异常就会消失,但是 menuPictureFragment 只出现在开头,在回转之后(在抛出异常之前)片段不再显示。

这到底是怎么回事?

最有可能的实际问题是:

该标签 R.string.fragment_tag_menu_picture_fragment 可能尚未应用 -

所以总是returnnull(可以理解为"fragment tag not found")。

然后它将尝试添加两次 MenuPictureFragment -

这将抛出未捕获的 IllegalStateException。例如:

String tag = fragmentActivity.getString(R.string.fragment_tag_menu_picture_fragment);
menuPictureFragment = MenuPictureFragment.newInstance(userIdParam);
menuPictureFragment.setTag(tag);

或者将所需的 String tag 传递给某些方法 .newInstance(String userId, String tag) 并让 Fragment 设置它自己的标签。

解决方案是:如果是嵌套片段/如果将片段添加到片段中,则需要使用 getChildFragmentManager() 而不是 getSupportFragmentManager()