Android阻止DialogFragment打开两次

时间:2016-12-06 07:56:59

标签: android android-fragments

我试图阻止我的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.有关于此的任何想法吗?

感谢。

2 个答案:

答案 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();
    }
}