所以我有一个很棒的功能:
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
只出现在开头,在循环返回之后(当异常被抛出之前),片段不再显示。
见鬼,这是怎么回事?
发布于 2019-06-11 23:02:31
解决方案是:如果是嵌套片段/如果将片段添加到片段,则需要使用getChildFragmentManager()
而不是getSupportFragmentManager()
。
发布于 2019-06-11 05:16:51
真正的问题很可能是:
该标记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
设置它自己的标记。
https://stackoverflow.com/questions/56533486
复制相似问题