【Kotlin】NumberPickerを使用したダイアログの実装

2020.05.11

どうも、むつたくです。
今回は、Swiftでお馴染みのUIPickerViewをAndroidのダイアログ上で実装する方法を紹介します。
Androidでは「NumberPicker」と言います。
ユーザに複数選択させたい時とかは便利ですね。イメージはこんな感じです。

 

 

今回使用するダイアログは「AlertDialog」になります。

 

今回やること

  1. NumberPickerの使い方
  2. AlertDialogにNumberPickerを実装
  3. 親画面に値を渡す

 

公式リファレンス

 

開発環境

  • macOS Catalina 10.15.3
  • AndroidStudio 3.6.2
  • Kotlin 1.3.61

 

NumberPickerの使い方

まずは、NumberPickerで選択したアイテムをTextViewに表示するということを実装します。
さて、NumberPickerですが、デザインのPaletteから選択することが出来ません。なぜか一覧にない…。
なのでXMLから作成していきます。まずはXML全体から。

 

activity_main.xml
[cc_xml]


[/cc_xml]

 

まずは、こんな感じになっていればOKです。
NumberPickerを使用する際には、以下のXMLコードをコピペすればデザイン上でもドラッグ出来るようになります。

 

[cc_xml]

[/cc_xml]

 

 

 

次はktファイルです。

 

MainActivity.kt

[cc_kotlin]
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.NumberPicker
import android.widget.TextView

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

this.initNumberPicker()
}

/**
* NUmberPicker初期化メソッド
**/
private fun initNumberPicker() {
val np = findViewById(R.id.numberPicker)
np.minValue = 1 // NumberPickerの最小値設定
np.maxValue = 10 // NumberPickerの最大値設定
np.value = 5 // NumberPickerの初期値

// NumberPickerのアイテムチェンジリスナー
np.setOnValueChangedListener { picker, oldVal, newVal ->
println(“前回選択値: $oldVal”)
println(“現在選択値: $newVal”)

// 選択したアイテムをTextViewに表示
findViewById(R.id.textSelectedItem).text = newVal.toString()
}
}

}
[/cc_kotlin]

 

要所にコメントは書いてありますが、NumberPickerで使用しているのは以下のプロパティになります。

プロパティ名 説明
minValue  NumberPickerの最小値を設定
maxValue  NumberPickerの最大値を設定
value  NumberPickerの初期値を設定

 

NumberPickerで選択した値をTextViewに表示するのは「setOnValueChangedListener」になります。
引数には以下の内容が格納されます。

引数 説明
picker  アイテムチェンジしたNumberPickerのクラス
oldVal  該当NumberPickerの前回値
newVal  該当NumberPickerの現在値

 

NumberPickerの使い方は以上になります。

 

AlertDialogの作成

次は、AlertDialogを作成していきます。このダイアログの中にNumberPickerを配置します。
作成手順は以下の3ステップになります。

  1. LayoutXML作成
  2. CustomDialogClass作成
  3. MainActivity.ktからコール

LayoutXML作成

まずはXMLを書きます。「res/layout」ディレクトリ直下に「Layout XML File」を作成します(New > XML > Layout XML File)。
ファイル名はここでは「number_picker_dialog.xml」にしました。
ダイアログのXMLは以下になります。

 

number_picker_dialog.xml

[cc_xml]



[/cc_xml]

 

CustomDialogClass作成

次はダイアログのコードを書きます。「java/[PackageName]」ディレクトリ直下に「Kotlin Class」を作成します(New > Kotlin File/Class)。
作成する際は「Class」を選択して下さい。
ファイル名はここでは「NumberPickerDialog.kt」にしました。

 

NumberPickerDialog.kt

[cc_kotlin]
import android.app.AlertDialog
import android.app.Dialog
import android.os.Bundle
import android.widget.NumberPicker
import androidx.fragment.app.DialogFragment

class NumberPickerDialog: DialogFragment() {

/**
* ダイアログ作成
**/
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

val inflater = activity!!.layoutInflater
val dialogView = inflater.inflate(R.layout.number_picker_dialog, null)!!
val builder = AlertDialog.Builder(context)

// Dialogの設定
builder.setView(dialogView)
builder.setTitle(“NumberPickerDialog”)
builder.setPositiveButton(“OK”) { dialog, id ->
}
builder.setNegativeButton(“CANCEL”) { dialog, id ->
}

// NumberPickerの設定
val np = dialogView.findViewById(R.id.numberPicker)
np.minValue = 1 // NumberPickerの最小値設定
np.maxValue = 10 // NumberPickerの最大値設定
np.value = 5 // NumberPickerの初期値

return builder.create()
}
}
[/cc_kotlin]

 

ここでのポイントが2つあります。

 

1つ目のポイントは、DialogFragmentクラスを継承します。
そうすることで、ダイアログを扱うことが出来る様になります。

 

2つ目ポイントは、AlertDialog.Builderです。
このメソッドを使用することでAlertDialogのViewを変更できたり、ボタンやタイトルを設定することができます。
19行目の「builder.setView」に先ほど作成したLayoutファイルを指定します。
20行目の「builder.setTitle」ではダイアログのタイトルを設定してます。
21行目の「builder.setPositiveButton」では後述しますが、ボタンを配置します。こちらはダイアログの内容を完了させる意味合いを持ちます。
23行目の「.setNegativeButton」ではこちらも後述しますが、同じくボタンを配置します。このボタンはダイアログの内容をキャンセルする意味合いを持ちます。

 

MainActivity.ktからコール

ダイアログを作成したので、親からこのダイアログをコールします。

 

activity_main.xml

[cc_xml]


Top