77

DialogFragment を使い始めました。向きの変更などでうまく機能しているためです。しかし、私が遭遇した厄介な問題があります。

進行状況をAsyncTask示す DialogFragment があり、それを却下しonPostExecuteます。onPostExecuteアプリケーションがバックグラウンドにある間 (たとえば、ホームボタンを押した後) に発生する場合を除いて、すべて正常に動作します。次に、DialogFragment を閉じるときにこのエラーが発生しました - " Can not perform this action after onSaveInstanceState"。どー。通常のダイアログは問題なく機能します。ただし、FragmentDialog ではありません。

アプリケーションがバックグラウンドにあるときにDialogFragmentを閉じる適切な方法は何ですか? 私は Fragments をあまり扱っていないので、何かが足りないだけだと思います。

4

5 に答える 5

164

DialogFragmentと呼ばれるメソッドがありますdismissAllowingStateLoss()

于 2012-04-23T05:03:46.073 に答える
10

これは私がしたこと(df == dialogFragment)です:

ダイアログを次のように呼び出すようにしてください。

df.show(getFragmentManager(), "DialogFragment_FLAG");

ダイアログを閉じたい場合は、次のチェックを行ってください。

if (df.isResumed()){
  df.dismiss();
}
return;

フラグメントのonResume()メソッドに次のものがあることを確認してください(dfではありません)

@Override
public void onResume(){
  Fragment f = getFragmentManager().findFragmentByTag("DialogFragment_FLAG");
  if (f != null) {
    DialogFragment df = (DialogFragment) f;
    df.dismiss();
  }
  super.onResume();
}   

このようにして、ダイアログが表示されている場合は閉じられます。表示されていない場合は、次にフラグメントが表示されるようになります(onResume)。

于 2013-02-21T15:20:49.580 に答える
0

うまくいくかもしれない解決策はFragment.setRetainInstance(true)、ダイアログフラグメントに設定することですが、それは最も美しい修正ではありません。

フレームワークが最初に状態を復元できるように、ダイアログ アクションをキューに入れなければならないことに気付くことがあります。現在の Looper を取得(Activity.getMainLooper())して Handler にラップできる場合は、そのキューに runnable をポストすることで、却下をキューの後ろに渡すことができます。

retaininstance(true)私はよく、 . を持つ別のフラグメントを使用することになりResultReceiverます。そのため、その結果レシーバーをジョブに渡し、その onReceive でコールバックを処理します (多くの場合、他のレシーバーのルーターとして)。ただし、非同期タスクを使用している場合、それは価値があるよりも少し多くの作業になる可能性があります。

于 2012-02-17T09:21:38.137 に答える