〈kotlin〉チェックボックス付きダイアログ

Android studioでkotlinを使ってAndroidアプリ作成の勉強中。

ボタンをタップしてダイアログを表示させたとき、
リストからチェックボックスを作成し、選択したアイテムを保存する処理を実装してみた。

val items = arrayOf("sample1", "sample2", "sample3")
val checkedItems = BooleanArray(item.size)

val selectedItems = ArrayList<Int>()

MaterialAlertDialogBuilder(this)
       .setTitle(R.string.title)
       .setMultiChoiceItems(items, checkedItems) { dialog, which, isChecked ->
            if (isChecked) {
                selectedItems.add(which)
            } else if (selectedItems.contains(which)) {
                selectedItems.remove(which)
            }
        }
        .setPositiveButton(R.string.ok_button) { _, _ ->
            makeList(selectedItems, items)
        }
        .setNegativeButton(R.string.cancel_button) { _, _ ->
        }
        .setCancelable(false)
        .show()
  • items

チェクボックスに表示したい項目を配列で用意する。

  • checkedItems

配列の各項目に対するチェックボックスがデフォルトでチェックされている(true)かいないか(false)。
今回はすべてfalseで、itemsの配列が変わっても対応できるようにBooleanArrayを作成。

  • seletedItems

ここに選択されたアイテムのポジションを保存する。

  • MaterialAlertDialogBuilder

MaterialDialogを使用。引数はcontext。

  • setMultiChoiceItems()

複数選択できるチェックボックスを配置する。
1つだけ選択させたい時はsetSingleChoiceItems()を使う。
項目の配列、選択状態の配列、選択時のリスナーの3つを引数にとる。
isChecked(選択状態)がtrueならwhich(項目のポジション)をseletedItemsに入れ、
falseならリストから削除する。

  • setPositiveButton()

ボタンに表示したいテキストとリスナーを渡し、OKボタンが押された場合の処理を記述する。
今回は別で作成したmakeList()メソッドの中でselectedItemsに対してforループを回して、
itemsの中の選択された要素に対する処理を実行するようにしてみた。

  • setNegativeButton()

キャンセルボタンが押された場合の処理があれば記述。

  • setCancelable()

ダイアログが表示されていないところを表示された時に、ダイアログがキャンセルできるかどうか。
デフォルトではtrueになっているが、
OKかCancelのどちらかを確実に選択させたい時はfalseにしておく。



参考
ダイアログ  |  Android デベロッパー  |  Android Developers
MaterialAlertDialogBuilder  |  Android Developers
【Android】 MaterialAlertDialogで色々実装する - Qiita