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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (33)

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

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.addfragmentTransaction.replace异常消失,但menuPictureFragment仅仅是在开始时就存在,盘旋回(抛出的异常时前)之后不再显示的片段。

这到底是怎么回事?

提问于
用户回答回答于

实际问题最有可能是:

该标签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设置它自己的标签。

扫码关注云+社区

领取腾讯云代金券