〈kotlin〉選択ツール TimePickerDialog, DatePickerDialog

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

時計から時刻を選択するTimePickerDialogと
カレンダーから日付を選択するDatePickerDialogを使ってみた。

レイアウト

各ダイアログを呼び出すためのButtonと、
選択した結果を表示するためのTextViewを配置。
ButtonのonClickに呼び出すメソッドを指定(メソッドはこの後作成)。

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical">


        <TextView
            android:id="@+id/time_picker_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="time" />

        <Button
            android:id="@+id/time_picker_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="time select" 
            android:onClick="showTimePickerDialog"/>


        <TextView
            android:id="@+id/date_picker_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="date" />

        <Button
            android:id="@+id/date_picker_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="date select"
            android:onClick="showDatePickerDialog"/>

</LinearLayout>

TimePickerDialog

TimePickerDialog のインスタンスを返すonCreateDialog()メソッドと、
時刻を設定したときにコールバックを受け取るTimePickerDialog.OnTimeSetListenerインターフェースを実装する。

class TimePickerFragment: DialogFragment(), TimePickerDialog.OnTimeSetListener {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        //最初に表示する時刻として現在の時刻を取得
        val c = Calendar.getInstance()
        val hour = c.get(Calendar.HOUR_OF_DAY)
        val minute = c.get(Calendar.MINUTE)

        return TimePickerDialog(requireContext(), this, hour, minute, DateFormat.is24HourFormat(activity))
        //引数はcontext: Context!, listener: TimePickerDialog.OnTimeSetListener!, hourOfDay: Int, minute: Int, is24HourView: Boolean
        //is24HourViewは24時間表記をするか(true)12時間表記をするか(false)
    }

    override fun onTimeSet(p0: TimePicker?, hour: Int, minute: Int) {
         //時間選択後の処理を記述
        (activity as MainActivity).findViewById<TextView>(R.id.time_picker_text).text =
            getString(R.string.time_text, hour, minute)
    }
}

DatePickerDialog

DatePickerDialog のインスタンスを返すonCreateDialog()メソッドと、
日付を設定したときにコールバックを受け取るDatePickerDialog.OnDateSetListener インターフェースを実装する。

class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val c = Calendar.getInstance()
        val year = c.get(Calendar.YEAR)
        val month = c.get(Calendar.MONTH)
        val day = c.get(Calendar.DAY_OF_MONTH)

        return DatePickerDialog(requireContext(), this, year, month, day)
        //引数はcontext: Context, listener: DatePickerDialog.OnDateSetListener?, year: Int, month: Int, dayOfMonth: Int
    }

    override fun onDateSet(p0: DatePicker?, year: Int, month: Int, day: Int) {
        //日付選択後の処理を記述
        (activity as MainActivity).findViewById<TextView>(R.id.date_picker_text).text =
            getString(R.string.date_text, year, month, day)
    }
}

onClickで呼び出すメソッドの定義

上記で作成したDialogFragmentのインスタンスで show() を呼び出す。
show()の引数としてFragmentManager のインスタンスとフラグメントの一意のタグ名が必要。

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }

    fun showTimePickerDialog(v: View) {
        TimePickerFragment().show(supportFragmentManager, "timePicker")
    }

    fun showDatePickerDialog(v:View){
        DatePickerFragment().show(supportFragmentManager, "datePicker")
    }
}

参考
Pickers  |  Android Developers