ダイアログのボタンをタップしたときに、ダイアログを閉じたくない場合があります。
しかし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 {
// ダイアログを閉じずに、エラーを表示するなど
}
}
}
}