アプリケーションがバックグラウンドにある間に対話フラージュを却下する適切な方法
-
27-10-2019 - |
質問
ダイアログフレーズを使用し始めました。なぜなら、それらはオリエンテーションの変更などを通じてうまく機能しているからです。しかし、私が遭遇した厄介な問題があります。
私は持っている AsyncTask
これは、進行状況の対話を示しており、それを却下します onPostExecute
. 。いつを除いてすべてが正常に機能します onPostExecute
アプリケーションがバックグラウンドにあるときに発生します(たとえば、ホームボタンを押した後)。それから私はDialogfragmentの却下でこのエラーを受けました - 」Can not perform this action after onSaveInstanceState
"。doh。定期的なダイアログは正常に機能します。しかし、fragmentdialogではありません。
それで、アプリケーションがバックグラウンドにある間に対話障害を却下する適切な方法は何ですか?私は本当にフラグメントをあまり使っていなかったので、何かが足りないと思います。
解決
DialogFragment
呼ばれるメソッドがあります dismissAllowingStateLoss()
他のヒント
これが私がしたことです (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)...
これは私があなたが望むことを達成するためにしなければならなかったことです:私は私が名前が付けられたダイアログフラグメントを表示していたフラグメントアクティビティを持っています fragment_RedemptionPayment
これは世界的に上部で宣言されています。次のコードは却下します DialogFragment
アクティビティがバックグラウンドに入り、前景に戻ってくる前に表示されていた場合。
@Override
public void onResume() {
super.onResume();
if(fragment_RedemptionPayment.isVisible()){
fragment_RedemptionPayment.dismiss();
}
}
機能する可能性のあるソリューションは設定です Fragment.setRetainInstance(true)
あなたの対話では、それは最もきれいな修正ではありません。
時々、フレームワークを最初に復元させるために、ダイアログアクションを列に並べなければならないことに気づきました。現在のルーパーを手に入れることができれば (Activity.getMainLooper())
そして、それをハンドラーにラップして、そのキューに実行可能なものを投稿して、キューの背面に解雇を渡すことができます。
私はしばしばそれが別の断片を使用することになります retaininstance(true)
それには ResultReceiver
. 。そのため、その結果レシーバーを自分のジョブに渡し、そのreceiveでコールバックを処理します(多くの場合、他のレシーバーのルーターとして)。しかし、それはあなたが非同期タスクを使用している場合、それは価値があるよりも少し作業かもしれません。