Edited at

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