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

时间:2019-06-10 21:01:54

标签: android android-fragments illegalstateexception

所以我有这个很棒的功能:

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.add替换为fragmentTransaction.replace,则异常消失,但menuPictureFragment仅出现在开始时,回圈后(抛出Exception之前)片段不存在显示了。

这到底是怎么回事?

2 个答案:

答案 0 :(得分:0)

实际问题很可能是:

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

,因此它将始终返回null(可以理解为“找不到片段标签”)。

,然后它将随后尝试两次添加该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设置它自己的标签。

答案 1 :(得分:0)

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

相关问题