📝

AlertDialogのリストの選択肢

2024/11/28に公開

はじめに

AlertDialog は、Android アプリ開発でよく使用される UI コンポーネントです。

とても便利で、リストの選択肢から処理を選択する実装をよくします。
https://developer.android.com/develop/ui/views/components/dialogs?hl=ja#AddAList

本記事では、Pair を使って、コードをシンプルに整理する方法を紹介します。


改善前のコード

AlertDialog - setItems の実装は、以下のようになります。

コード例

val items = arrayOf("メール", "電話")

AlertDialog.Builder(context)
    .setTitle("連絡方法")
    .setItems(items) { _, which ->
        when (which) {
            0 -> android.util.Log.d("mail", "メールを送信")
            1 -> android.util.Log.d("tel", "電話をかける")
        }
    }
    .show()

問題点

例えば Line を増やしたい...となった場合

  1. 選択肢と処理が分離
    選択肢と処理が別々に記述されているため、変更時にミスが発生しやすい。

  2. 順序の変更が面倒
    選択肢の順序を変更すると、対応する when 文も修正する必要がある。

  3. 拡張性の欠如
    選択肢が増えると when 文が複雑化し、管理が難しくなる。

... index を意識するのがめんどくさい。


改善後のコード

Pair を使うことで、選択肢と処理をシンプルに整理できます。

改善後のコード例

val items = listOf(
    Pair("メール", { android.util.Log.d("mail", "メールを送信") }),
    Pair("電話", { android.util.Log.d("tel", "電話をかける") }),
)

AlertDialog.Builder(context)
    .setTitle("連絡方法")
    .setItems(items.map { it.first }.toTypedArray()) { _, which ->
        // 選択されたアイテムのコールバックを実行
        items[which].second()
    }
    .show()

改善ポイント

  • シンプルな構造
    • Pair を使って選択肢と処理を同じ場所に定義。
    • コードの可読性が向上し、変更や順序の入れ替えも簡単に。

実行結果

  1. 「メール」を選択
    → コンソール出力に「メールを送信」と表示。

  2. 「電話」を選択
    → コンソール出力に「電話をかける」と表示。


この方法のメリット

  • 柔軟性: 選択肢を簡単に追加・削除・並べ替え可能。
  • 可読性: 選択肢と処理が同じ場所に記述されているため、コードの意図が明確。
  • 保守性: 修正が必要な箇所が少なく、コードの変更が容易。

例: Line を追加

val items = listOf(
    Pair("メール", { android.util.Log.d("mail", "メールを送信") }),

    //追加
    Pair("Line", { android.util.Log.d("line", "Lineを送信") }),

    Pair("電話", { android.util.Log.d("tel", "電話をかける") }),
)

... 入れ替え・挿入・削除の実装も負担が少ない。


まとめ

本記事では、AlertDialog の実装を改善する方法として、Pair を使ったシンプルな実装を紹介しました。

Discussion