2016-12-06 8 views
0

DialogFragmentの開封を2回防ぎたいと思っています。ここに私がしていることがあります:AndroidでDialogFragment openingが2回開かれないようにする

私は自分の断片のインスタンスを1つだけ保持しようとします。私が作成し、このように私のフラグメントを追加します。

//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.任意のアイデアを得ますか?

ありがとうございました。

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(); 
    } 
} 
+0

あなたはエラーを受け取った理由で、同じフラグメントを処理します。 –

+0

@DivyeshなぜmyFragment.isAdded()は2番目の呼び出しでfalseを返しますか?私はそれを取得しません。 – yrazlik

答えて

0

は確かにそれは@Androidジャックが述べたように、あなたが、this answer、 またはより良いがcommitNow()を使用して同じよう
executePendingTransactions()を使用するか、このような何かを試すことができますので、非同期の問題は、取引のコミットです私はこれがフラグメントトランザクションの非同期動作と関係があると考えています。フラグメントトランザクションは非同期にコミットされます。最初の呼び出しでは、フラグメントは追加されますが、非同期にコミットされます。次回の呼び出しでは、フラグメントはまだコミットされていないため追加されません。myFragment.isAdded()はfalseを返します。それによって例外が発生します。
は、あなたの(!myFragment.isAdded())コードの前に、この

getFragmentManager().executePendingTransactions(); 

を使用してみてください。

1

関連する問題