所以我有这个很棒的功能:
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之前)片段不存在显示了。
这到底是怎么回事?
答案 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()
。