130

ドキュメントは、クラスのdismiss()メソッドについて次のように述べています。Dialog

このダイアログを閉じて、画面から削除します。このメソッドは、どのスレッドからでも安全に呼び出すことができます。ダイアログが閉じられたときにクリーンアップを行うためにこのメソッドをオーバーライドするのではなく、代わりにで実装する必要があることに注意してくださいonStop()

私のコードでは、getDialog().dismiss()それを却下するために呼び出すだけです。しかし、私は他に何もしていませんし、も使用していませんonStop()DialogFragmentそのため、メモリリークなどを回避するために、を正しく閉じる方法を正確に尋ねています。

4

13 に答える 13

212

tl;dr: a を閉じる正しい方法は、 DialogFragment で直接DialogFragment使用することです。dismiss()


詳細: DialogFragment状態のドキュメント

ダイアログの制御 (表示、非表示、閉じるタイミングの決定) は、ダイアログを直接呼び出すのではなく、ここで API を介して行う必要があります。

したがって、を使用しないでください。これは、ダイアログでgetDialog().dismiss()呼び出されるためです。代わりに、DialogFragment 自体のメソッドを使用する必要があります。dismiss() dismiss()

public void 却下()

フラグメントとそのダイアログを閉じます。フラグメントがバック スタックに追加された場合、このエントリまでのすべてのバック スタックの状態がポップされます。それ以外の場合、フラグメントを削除するために新しいトランザクションがコミットされます。

ご覧のとおり、これにより、ダイアログを閉じるだけでなく、プロセスに含まれるフラグメント トランザクションも処理されます。

onStop手動のクリーンアップ (ファイルのクローズ、カーソルのクローズなど) が必要なリソースを明示的に作成した場合にのみ使用する必要があります。それでも、基になるダイアログではonStopなく、DialogFragmentをオーバーライドします。onStop

于 2012-08-28T15:35:35.933 に答える
4

あなたはあなたを却下するべきなのでDialogonPause()それを上書きしてください。

また、却下する前にnull、以下のスニペットを確認して表示しています。

@Override
protected void onPause() {
    super.onPause();
    if (dialog != null && dialog.isShowing()) {
        dialog.dismiss();
    }
}
于 2012-06-26T05:15:15.747 に答える
0

ダイアログ フラグメントを安全に閉じる方法を示す以下のサンプル コード スニペットを検討してください。

DialogFragment dialogFragment = new DialogFragment();

/** 
 * do something
 */

// Now you want to dismiss the dialog fragment
if (dialogFragment.getDialog() != null && dialogFragment.getDialog().isShowing())
{
    // Dismiss the dialog
    dialogFragment.dismiss();
}

ハッピーコーディング!

于 2020-12-16T11:49:37.367 に答える
0

非表示にしたいフラグメントから Dismiss() を呼び出すだけです。

imageView3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            dismiss();
        }
    });
于 2019-04-26T08:02:50.787 に答える