【问题标题】:IllegalStateException: Fragment already added not caught with try-catchIllegalStateException:已添加的片段未使用 try-catch 捕获
【发布时间】:2019-06-11 23:02:30
【问题描述】:

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

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 只出现在开头,在循环回来之后(在抛出异常之前)片段不再显示。

这到底是怎么回事?

【问题讨论】:

    标签: android android-fragments illegalstateexception


    【解决方案1】:

    实际问题最有可能是:

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

    【讨论】:

    • 我已经检查过了,fragmentActivity.getSupportFragmentManager().findFragmentByTag(fragmentActivity.getString(R.string.fragment_tag_menu_picture_fragment)); 返回正确的值。
    • setTag 也不存在
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多