2012-06-26 12 views
79

ドキュメントはDialogクラスからdismiss()メソッドのためにこれを言う:私のコードではDialogFragmentを正しく解除するにはどうすればよいですか?

Dismiss this dialog, removing it from the screen. This method can be invoked 
safely from any thread. Note that you should not override this method to do 
cleanup when the dialog is dismissed, instead implement that in onStop(). 

、私はすべてそれを却下する呼び出しgetDialog().dismiss()です。しかし、私は何もしていない、あるいはonStop()を使っています。だから、正確にどのようにメモリリークなどを避けるためにDialogFragmentを却下するかを尋ねています。

答えて

136

TL; DR:DialogFragmentを閉鎖する正しい方法はDialogFragmentに直接dismiss()を使用することです。


詳細:ダイアログ(表示、非表示、それを閉じたときに決定)のdocumentation of DialogFragment状態

コントロールがない、ダイアログ上の直接呼び出して、ここにAPIを介して行われるべきです。それは、ダイアログにdismiss()を呼び出しますので、

したがって、あなたは、getDialog().dismiss()を使用しないでください。代わりに、あなたはDialogFragment自体のdismiss()方法を使用する必要があります。

公共ボイド(解任)

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

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

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

+4

残念ながら、これは私の含まれているアクティビティが終了する原因となっています... –

+0

@ScootrNova:あなたはおそらく他の場所にバグを持ってはいけません。どのように断片を作りますか? – Heinzi

+0

'protected void showDialogFragment(最終的なDialogFragmentフラグメント){final FragmentTransaction fTransaction = getSupportFragmentManager()。beginTransaction(); fTransaction.addToBackStack(null); fragment.show(fTransaction、 "dialog");} ' 厄介なライナーのために申し訳ありません!しかし、あなたが正しいかもしれないので、当分の間、私はDialogFragmentsを閉じる別の方法を書いてきました。私がdismiss()メソッドを使ってそれらを却下する方法は、タグでフラグメントを見つけて、それがヌルでない場合にはdismiss()を実行することでした。ああ、ええ、私はそのメソッドに渡す前に断片を直しています。 –

0

DialogonPause()に却下してください。あなたがnullをチェックすることができる解雇と以下のように表示される前に、また

はスニペット:

@Override 
protected void onPause() { 
    super.onPause(); 
    if (dialog != null && dialog.isShowing()) { 
     dialog.dismiss(); 
    } 
} 
+0

彼は彼が解任やっていることをすでに書かれている()とそのDialogFragmentについて。 –

+0

私はこれがDialogとDialogFragmentsの両方で動作すると思います。@PareshMayani – Venky

+2

@PareshMayaniは正しいVenkyです。 googleの 'DialogFragment'チュートリアルでは、' onPause() 'メソッドが全く使われていないことを示しています。しかし、私はあなたがしていることを見ていると思う。しかし、もしユーザが 'onPause()'を呼び出さなければ、何がポイントになりますか?システムがフラグメントが離れて呼び出されていることをシステムが認識したときのことです。いつ、ユーザーがキャンセルしたかその場合、それを閉じるにはどうすればよいでしょうか? – Andy

48

私はDialogFragmentを閉じるには良い方法はこれだと思う:

Fragment prev = getSupportFragmentManager().findFragmentByTag("fragment_dialog"); 
    if (prev != null) { 
     DialogFragment df = (DialogFragment) prev; 
     df.dismiss(); 
    } 

あなたはいけない。この方法は、DialogFragmentへの参照を保持する必要があるとどこからでも、それを閉じることができます。

関連する問題