web-dev-qa-db-ja.com

アプリケーションがバックグラウンドにあるときにDialogFragmentを閉じる適切な方法

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

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

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

63
Sver

DialogFragmentにはdismissAllowingStateLoss()というメソッドがあります

136
Jiang Qi

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

この方法でダイアログを呼び出すようにしてください:

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

ダイアログを非表示にするには、次のチェックを行います。

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

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

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

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

10

これは、あなたが望むものを達成するために私がしなければならなかったことです。私は、一番上でグローバルに宣言されているfragment_RedemptionPaymentという名前のダイアログフラグメントを示していたフラグメントアクティビティを持っています。次のコードは、アクティビティがバックグラウンドになり、フォアグラウンドに戻る前に表示されていた場合、DialogFragmentを閉じます。

     @Override
        public void onResume() {
            super.onResume();        
            if(fragment_RedemptionPayment.isVisible()){
                fragment_RedemptionPayment.dismiss();
            }
}
3
Shahid Sarwar

動作する可能性のある解決策は、dialogfragmentでFragment.setRetainInstance(true)を設定することですが、それは最も美しい修正ではありません。

フレームワークが最初に状態を復元できるようにするには、ダイアログアクションをキューに入れる必要があることに気づきました。現在のルーパー_(Activity.getMainLooper())_を取得し、それをハンドラーでラップできる場合は、そのキューにrunnableをポストすることで、解雇をキューの後ろに渡すことができます。

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

0