2021 Oct. 30.
出典 Android - android開発 DialogFragmentのonStart()内でのOKボタンのOnClickイベント捕捉|teratail
概要
TextWatcherでEditTextへの入力状況を監視し、条件を満たした時のみOKボタンを有効(isEnabled)にする。
TextWatcherのafterTextChanged()にOKボタン有効可否判定処理を定義する。
DialogFragmentのonCreateDialog()内でのAlertDialog.Builderのcreate()時に、「OKボタンを取得し、TextWatcherによってOKボタンをコントロールする」ハンドラをAlertDialogのOnShowイベントにセットする。
出典ページからのコード
class MyDialogFragment: DialogFragment() { // 2つの EditText に文字列があるか無いかで buttonの enable を制御する class EditsWatcher(val button: Button, val edit1: EditText, val edit2: EditText): TextWatcher { init { edit1.addTextChangedListener(this) edit2.addTextChangedListener(this) afterTextChanged(null) } override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} //ignore override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} //ignore override fun afterTextChanged(s: Editable?) { button.isEnabled = edit1.text.toString().trim().isNotEmpty() && edit2.text.toString().trim().isNotEmpty(); } } // ダイアログ表示 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return activity?.let { val view = requireActivity().layoutInflater.inflate(R.layout.my_dialog, null) val edData1 = view.findViewById<EditText>(R.id.etData1) // EditText取得 val edData2 = view.findViewById<EditText>(R.id.etData2) // EditText取得 val builder = AlertDialog.Builder(it).setView(view) .setPositiveButton(android.R.string.ok, { dialog, id -> }) .setNegativeButton(android.R.string.cancel, { dialog, id -> dialog.cancel() }) builder.create().also { dialog -> // dialogを返すと共にdialogにOnShowListenerをセットする dialog.setOnShowListener({ val button = dialog.getButton(Dialog.BUTTON_POSITIVE) EditsWatcher(button, edData1, edData2) }) } } ?: throw IllegalStateException("Activity cannot be null") }