我试图阻止我的DialogFragment打开两次。这是我的工作:
我尝试只保留一个片段实例。我创建并添加我的片段:
//MyFragment.java
public static MyFragment mInstance;
public static void instantiateFragment() {
MyFragment myFragment = MyFragment.getInstance();
if(!myFragment.isAdded()) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(myFragment, TAG);
ft.commit();
}
}
private static MyFragment getInstance() {
if(mInstance == null) {
mInstance = new MyFragment();
}
return mInstance;
}
当点击一个按钮时,我故意尝试像这样添加两次片段:
MyFragment.instantiateFragment();
MyFragment.instantiateFragment();
但是我得到IllegalStateException: Fragment already added.
有关于此的任何想法吗?
感谢。
答案 0 :(得分:1)
我认为这与片段事务的异步行为有关。片段事务是异步提交的。所以在第一次调用时,你的片段被添加,但是它是异步提交的。在你的下一个调用中你的片段没有被添加,因为它还没有被提交!myFragment.isAdded()返回false。然后在添加片段时,前一个事务是因此引起例外的承诺 尝试使用此
getFragmentManager().executePendingTransactions();
在你的(!myFragment.isAdded())代码之前。
答案 1 :(得分:0)
确实是异步提交事务的问题,所以@Android杰克声明你可以像this answer一样使用executePendingTransactions()
,
甚至更好地使用commitNow()
,
或尝试这样的事情:
public static void instantiateFragment() {
Fragment myFragment = getSupportFragmentManager().findFragmentByTag(TAG);
if (myFragment == null) {
myFragment = MyFragment.getInstance();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(myFragment, TAG);
ft.commit();
}
}