【问题标题】:Android prevent DialogFragment opening twiceAndroid阻止DialogFragment打开两次
【发布时间】:2016-12-06 07:56:58
【问题描述】:

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

谢谢。

【问题讨论】:

  • 你在它上面处理相同的片段。这就是你得到错误的原因。
  • @Divyesh 为什么 myFragment.isAdded() 在第二次调用时返回 false?我不明白。

标签: android android-fragments


【解决方案1】:

确实这是事务异步提交的问题,因此正如@Android jack 所说,您可以像在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();
    }
}

【讨论】:

    【解决方案2】:

    我认为这与片段事务的异步行为有关。片段事务是异步提交的。因此,在第一次调用时,添加了您的片段,但它是异步提交的。再次在您的下一次调用中,您的片段未添加,因为它尚未提交,所以 !myFragment.isAdded() 返回 false。然后在添加片段时,前一个事务是已提交,因此引发异常。
    尝试使用这个

    getFragmentManager().executePendingTransactions(); 
    

    在您的 (!myFragment.isAdded()) 代码之前。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 2020-05-14
      • 2022-07-11
      • 1970-01-01
      相关资源
      最近更新 更多