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()
。
所以我有这个神奇的功能:
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()
。