Android
Kotlin

AlertDialogのボタンタップでダイアログを閉じない方法

ダイアログのボタンをタップしたときに、ダイアログを閉じたくない場合があります。
しかしAlertDialog.Builder#setPositiveButtonなどを使用すると、ボタンタップ時に問答無用でダイアログが閉じてしまいます。
これを回避して閉じる/閉じないを制御するには次のような実装をすればよいです。
onResumeでボタンを取得してsetOnClickListenerで振る舞いをオーバーライドしています。

class DummyDialogFragment() : DialogFragment() {
    companion object {
        fun newInstance(): DummyDialogFragment {
            val instance = DummyDialogFragment()
            val args = Bundle()
            instance.arguments = args
            return instance
        }
    }

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val layoutInflater = LayoutInflater.from(requireContext())
        val view = layoutInflater.inflate(R.layout.dialog_layout, null)
        return AlertDialog.Builder(requireContext())
                .setView(view)
                .setPositiveButton(getString(R.string.dialog_button_title_ok), null) // タップ時の振る舞いは`onResume`で設定される
                .create()
    }

    override fun onResume() {
        super.onResume()
        val alertDialog = dialog as AlertDialog
        val positiveButton = alertDialog.getButton(Dialog.BUTTON_POSITIVE)
        // positiveButtonの振る舞いをこのタイミングで実装する
        positiveButton.setOnClickListener {
            val name = (editText?.text?.toString() ?: "").trim()
            if (true) {
                // ダイアログを閉じる
                dismiss()
            } else {
                // ダイアログを閉じずに、エラーを表示するなど
            }
        }
    }
}

参考
https://stackoverflow.com/questions/2620444/how-to-prevent-a-dialog-from-closing-when-a-button-is-clicked