rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

android開発 ダイアログ上の2つの EditText の両方に文字列がある時にOKボタンを有効にする

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")
}