【Android】【Kotlin】AlertDialogを使ってダイアログを表示させてみた

こんにちはkazuです。
本日はKotlinでのダイアログの出し方を書いていこうと思います。

はじめに

今回出していくダイアログはAlertDialog.Builderを使ってダイアログを表示させていきたいと思います。
ちなみにどう言うダイアログが出るかというのは以下3つのパターンを想定しています。
①ポジティブボタン、ネガティブボタン、ニュートラルボタン

②ポジティブボタン、ネガティブボタン

③ポジティブボタン

※ポジティブボタン(pos)、ネガティブボタン(neg)、ニュートラルボタン(neu)

実際にコードを見てみよう

以下二つのファイルを作成しました。
MainActivity.kt 及び CustomAlertDialog.ktです。
実際に呼び出すようにする処理は CustomAlertDialog.ktになります。

class KotlinSampleActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
     // 3つボタンのダイアログクリックリスナー
        kotlinSampleActivityBinding.threeButton.setOnClickListener { v ->
            CustomAlertDialog.showDefaultAlertDialog(
                this,
                "3つボタン(タイトル)",
                "ダイアログメッセージです",
                "pos",
                "neg",
                "neu"
            )
        }

     // 2つボタンのダイアログクリックリスナー
        kotlinSampleActivityBinding.twoButton.setOnClickListener { v ->
            CustomAlertDialog.showDefaultAlertDialog(
                this,
                "3つボタン(タイトル)",
                "ダイアログメッセージです",
                "pos",
                "neg"
            )
        }

        // 1つボタンのダイアログクリックリスナー
        kotlinSampleActivityBinding.oneButton.setOnClickListener { v ->
            CustomAlertDialog.showDefaultAlertDialog(
                this,
                "1つボタン(タイトル)",
                "ダイアログメッセージです",
                "pos"
            )
        }
    }
}
class CustomAlertDialog {
    companion object {
        /**
         * デフォルトアラートダイアログを表示する(ポジティブボタン)
         *
         * @param activity アクティビティ
         * @param title タイトルテキスト
         * @param message メッセージテキスト
         * @param positiveButtonText ポジティブボタンテキスト
         */
        fun showDefaultAlertDialog(
            activity: Activity?,
            title: String?,
            message: String?,
            positiveButtonText: String?
        ) {
            val clickListener =
                DialogInterface.OnClickListener { dialog, id ->
                    when (id) {
                        DialogInterface.BUTTON_POSITIVE -> {
                            // ポジティブボタン処理
                            println("Click Positive Button")
                        }
                    }
                }
            defaultAlertDialog(
                activity, title, message, positiveButtonText,
                null, null, clickListener
            )
        }

        /**
         * デフォルトアラートダイアログを表示する(ポジティブボタン、ネガティブボタン、ニュートラルボタン)
         *
         * @param activity アクティビティ
         * @param title タイトルテキスト
         * @param message メッセージテキスト
         * @param positiveButtonText ポジティブボタンテキスト
         * @param negativeButtonText ネガティブボタンテキスト
         */
        fun showDefaultAlertDialog(
            activity: Activity?,
            title: String?,
            message: String?,
            positiveButtonText: String?,
            negativeButtonText: String?
        ) {
            val clickListener =
                DialogInterface.OnClickListener { dialog, id ->
                    when (id) {
                        DialogInterface.BUTTON_POSITIVE -> {
                            // ポジティブボタン処理
                            println("Click Positive Button")
                        }

                        DialogInterface.BUTTON_NEGATIVE -> {
                            // ネガティブボタン処理
                            println("Click Negative Button")
                        }
                    }
                }
            defaultAlertDialog(
                activity, title, message, positiveButtonText,
                negativeButtonText, null, clickListener
            )
        }

        /**
         * デフォルトアラートダイアログを表示する(ポジティブボタン、ネガティブボタン、ニュートラルボタン)
         *
         * @param activity アクティビティ
         * @param title タイトルテキスト
         * @param message メッセージテキスト
         * @param positiveButtonText ポジティブボタンテキスト
         * @param negativeButtonText ネガティブボタンテキスト
         * @param neutralButtonText ニュートラルボタンテキスト
         */
        fun showDefaultAlertDialog(
            activity: Activity?,
            title: String?,
            message: String?,
            positiveButtonText: String?,
            negativeButtonText: String?,
            neutralButtonText: String?
        ) {
            val clickListener =
                DialogInterface.OnClickListener { dialog, id ->
                    when (id) {
                        DialogInterface.BUTTON_POSITIVE -> {
                            // ポジティブボタン処理
                            println("Click Positive Button")
                        }

                        DialogInterface.BUTTON_NEUTRAL -> {
                            // ニュートラルボタン処理
                            println("Click Neutral Button")
                        }

                        DialogInterface.BUTTON_NEGATIVE -> {
                            // ネガティブボタン処理
                            println("Click Negative Button")
                        }
                    }
                }
            defaultAlertDialog(
                activity, title, message, positiveButtonText,
                negativeButtonText, neutralButtonText, clickListener
            )
        }

        private fun defaultAlertDialog(
            activity: Activity?,
            title: String?,
            message: String?,
            positiveButtonText: String?,
            negativeButtonText: String?,
            neutralButtonText: String?,
            clickListener: DialogInterface.OnClickListener
        ) {
            fun onCreateDialog(savedInstanceState: Bundle): Dialog {
                return activity?.let {
                    // Use the Builder class for convenient dialog construction
                    val builder = AlertDialog.Builder(it)
                    builder.setCancelable(false)
                    if (title != null) {
                        // タイトルをセットする
                        builder.setTitle(title)
                    }
                    // メッセージをセットする
                    builder.setMessage(message)
                    // ポジティブボタンをセットする
                    builder.setPositiveButton(positiveButtonText, clickListener)
                    if (neutralButtonText != null) {
                        // ニュートラルボタンをセットする
                        builder.setNeutralButton(neutralButtonText, clickListener)
                    }
                    if (negativeButtonText != null) {
                        // ネガティブボタンをセットする
                        builder.setNegativeButton(negativeButtonText, clickListener)
                    }


                    // Create the AlertDialog object and return it
                    builder.create()
                } ?: throw IllegalStateException("Activity cannot be null")
            }
            val bundle: Bundle = Bundle()
            onCreateDialog(bundle).show()
        }

    }
}

ちょっと解説

実際に簡単にですが解説していこうかと思います。
まずshowDefaultAlertDialog()はオーバーロードを用いてボタンの数を制御しています。
また引数として渡しているのはActivity、タイトル、メッセージ、ボタンテキストになります。
DialogInterface.OnClickListenerはボタンの処理を入れています。(DialogInterface)
BUTTON_POSITIVE(ポジティブボタン)
BUTTON_NEGATIVE(ネガティブボタン)
BUTTON_NEUTRAL(ニュートラルボタン)

そしてdefaultAlertDialog()で実際にAlertDialogクラスを呼び出してダイアログを表示させています。
ちなみにダイアログのボタン処理はnullチェックをしてボタンを表示させるかさせないかを判定すると言う方法にしました!
あと知っておくと良いのはbuilder.setCancelable(false) この処理でダイアログ外をタップしてもダイアログが閉じないようになっています。
逆にtrueに設定をするとダイアログ外をタップした時にダイアログが閉じてしまいます。

最後に

いかがでしたでしょうか?
ダイアログを出す処理について解説していきました。
役に立てれば幸いです。
最後までご覧いただきありがとうございました。