3

私のアプリのアクティビティでは、何かがアップロードされている間に、「読み込み中」の取り消し不可能なFragmentDialogを表示する必要があります。私はこのような私の現在の活動中のコールバックからこのダイアログを表示:アクティビティがバックグラウンドである間にDialogFragment(サポートライブラリ)を閉じるIllegalStateExceptionを取得する

final FragmentManager fm = getSupportFragmentManager(); 
final FragmentTransaction ft = fm.beginTransaction(); 
final Fragment prev = fm.findFragmentByTag("loading"); 
if (prev != null) { 
    ft.remove(prev); 
} 
ft.addToBackStack(null); 
final DialogFragment df = 
     IndeterminateProgressDialogFragment.newInstance(
     getString(R.string.loading_dialog_sending_data)); 
df.setCancelable(false); 
df.show(ft, "loading"); 

アップロードが私のUIの断片から実行される(asynctaskを使用して)保持断片で起こっています。アップロードが完了すると、私のフラグメントにonActivityResultが通知され、現在はダイアログを閉じようとします。これまでは、onActivityResultでコールバックを使用して読み込みダイアログを閉じるという責任を委譲していましたが、それはうまくいきません。

私のアクティビティがフォアグラウンドになっている間にこのダイアログを閉じることはできますが、バックグラウンドにいるときはIllegalStateExceptionが発生します:onSaveInstaneStateの後でこのアクションを実行できません。私はonRemoveを使ってみましたが、これは私のアプリケーションがクラッシュすることはありませんが、DialogFragmentを隠すこともありません。私はあなたの私の断片と私の活動で両方のことをやってきましたが、まだ問題があります。

私はドキュメントを読んでいますが、使用できる方法はありません。

DialogFragmentは必要なように使用されていないと思われますか、何をすべきですか?

答えて

2

私は汚い回避策でこの問題を解決するために管理:

私はIllegalStateExceptionがキャッチし、フラグをtrueに設定されているので、私の断片が戻って来るとき、私は私が解任しようとした知っています。

//All this code is inside my ui Fragment 
@Override 
public void onResume() { 
    super.onResume(); 
    final boolean kill = getArguments().getBoolean(ARG_KILL_LOADING, false); 
    if (kill) { 
     final DialogFragment df = (DialogFragment) 
       getFragmentManager().findFragmentByTag("loading"); 
     if (df != null) { 
      df.dismiss(); 
     } 
    } 
} 


//Here I got workerfragment result and try to dismiss my DialogFragment 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 

    try { 
     final DialogFragment df = (DialogFragment) getFragmentManager().findFragmentByTag("loading"); 
     if (df != null) { 
      df.dismiss(); //Let's throw an IllegalStateException if on background! 
     } 
    } catch(IllegalStateException ex) { 
     //dirty way to avoid crashing while on background: 
     //we will ask our ui fragment to dismiss df when ui fragment comes back onResume 
     getArguments().putBoolean(ARG_KILL_LOADING, true); 
    } 

//Do something on ui with workerfragment result 

} 

しかし、私はまだonBackgroundの間にFragmentDialogを却下する正しい方法が何か不思議です。私は同じ問題を抱えた別のプロジェクトを持っています:/

2

onActivityResultとcatch例外でフラグメントを解除する必要はありません。

ただonActivityResultにフラグを立てます。私は静的変数を使用します。

public class MyFragment extends DialogFragment { 
      private static boolean KILL_FLAG = false; 

      @Override 
      public Dialog onCreateDialog(Bundle savedInstanceState) { 
       KILL_FLAG = false; 
      } 

      @Override 
      public void onActivityResult(int requestCode, int resultCode, 
      Intent data) { 
        KILL_FLAG = true; 
      } 

      @Override 
      public void onResume() { 
       super.onResume(); 

       if(KILL_FLAG){ 
        dismiss(); 
       } 
      } 
    } 
+0

しかし、その後、私のフラグメントダイアログが私の保有フラグメント(バックグラウンドで仕事をしている1)の対象とすべきであり、私のダイアログが私のUIフラグメントに結果を渡します。私は正しい? – Platonius

+0

これは、show wait \ loadingダイアログでのみ行いますか?なぜあなたはonActivityResultを使用しますか?私は正しい? – garmax1

+0

はい、あります。 onActivityResultを使用すると、ワーカーのフラグメントから結果が得られるので、アップロードが成功したかどうかを知ることができます。 – Platonius

関連する問題