くま's Tech系Blog

基本的には技術で学んだことを書き留めようと思います。雑談もやるかもね!

AlertDialogを作る

AlertDialogを今までActivityで作ってましたが、そうするとメモリーリークが発生するので、 DialogFragmentを継承させて、呼び出すようにしました。 その時の手順です。

①AlertDialogのクラスの作成

DialogFragmentを継承させたクラスを作成し、そこで、ライフサイクルの管理をします。

class AlertDialog : DialogFragment() {
    var title = "title"
    var okText = "OK"
    var onOkClickListener : DialogInterface.OnClickListener? = null

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val builder = AlertDialog.Builder(context!!)
        builder.setTitle(title)
                .setPositiveButton(okText, onOkClickListener)
        return builder.create()
    }

    override fun onPause() {
        super.onPause()
        // ダイアログを閉じる
        dismiss()
    }
}

とりあえずはメッセージとOKボタンのみを簡易的に表示させるようにしています。 AlertDialogを生成し、戻り値にしています。

②実際使うActivityに適用

①で作ったAlertDialogをActivityで表示させるようにします。

class MainActivity:  AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 省略

        var dialog = AlertDialog()
        dialog.title = "更新しました"
        dialog.onOkClickListener = DialogInterface.OnClickListener { dialog, which ->
            finish()
        }
            dialog.show(supportFragmentManager, null)
        }
    }
}

①で作ったAlerDialogをインスタン化して、タイトルとOKボタンを押したときの処理をここで実装します。 ①で作ったクラスをAlertDialogにするとインポートする際に複数のクラスが出てくるかと思いますが、自分で作ったクラスをインポートしてください

この方法だとカスタマイズしたAlertDialogを表示させることもでき、DialogFragmentのライフサイクルで管理するので、メモリリークは起こりにくいと思います。

参照

Dialogと仲良くなる その1