Androidでは日付や時間をユーザー入力のために TimePicker や DatePickerを使うとユーザビリティが上がります。Kotlinではどのように設定するのでしょうか確認してみます。
 
![[Android & Kotlin] TimePicker の実装 1x1.trans - [Android & Kotlin] TimePicker の実装](https://akira-watson.com/wp-content/themes/simplicity2/images/1x1.trans.gif)
2021.1.1
DialogFragment
Pickerの実装については DialogFragment を使うことが推奨されています。また、Time Picker はDate Picker と同様に作成できます。
尚、DatePickerのケースは以下を参考に
 
TimePicker
の解説では、Layout の android:onClick で Activity のメソッドが呼ばれ、Picker の DialogFragment が表示されます。
| 
					 1 2 3  | 
						<Button     ...     android:onClick="showTimePickerDialog" />  | 
					
 
では、設定したデータをどうやって取り出すのか?
 
Layout での android:onClick をやめてしまうという方法もありますが
Picker の DatePickerDialog.OnDateSetListener を使って、 MainActivity にデータを戻してやればいいようです
サンプルコード
新たに、Kotlin のクラスファイルを作成します。
TimePick.kt
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33  | 
						//package com.example.testtimepicker import android.app.Dialog import android.widget.TimePicker import android.app.TimePickerDialog import android.icu.util.Calendar import android.os.Bundle import androidx.fragment.app.DialogFragment class TimePick : DialogFragment(), TimePickerDialog.OnTimeSetListener {     // Bundle sould be nullable, Bundle?     override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {         // to initialize a Calender instance         val c = Calendar.getInstance()         // at the first, to get the system current hour and minute         val hour = c.get(Calendar.HOUR_OF_DAY)         val minute = c.get(Calendar.MINUTE)         return TimePickerDialog(             activity,             // in order to return parameters to MainActivity             activity as MainActivity?,             hour,             minute,             true)     }     override fun onTimeSet(view: TimePicker, hourOfDay: Int, minute: Int) {         //     } }  | 
					
 
元の設定:
return new DatePickerDialog(activity, this, year, month, day);
新しい設定:
return new DatePickerDialog(this.context as Context, activity asMainActivity?, …);
DatePickerDialog() の第2引数が自分自身 this になっているので
これを、MainActivity? にしてやります
 
MainActivity.kt
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36  | 
						//package com.example.testtimepicker import android.app.TimePickerDialog import android.os.Bundle import android.view.View import android.widget.TimePicker import androidx.fragment.app.FragmentActivity // ViewBinding import com.example.testtimepicker.databinding.ActivityMainBinding class MainActivity : FragmentActivity(), TimePickerDialog.OnTimeSetListener {     private lateinit var binding: ActivityMainBinding     override fun onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)         binding = ActivityMainBinding.inflate(layoutInflater)         setContentView(binding.root)     }     override fun onTimeSet(view: TimePicker, hourOfDay: Int, minute: Int) {         val str: String = getString(R.string.stringformat, hourOfDay, minute)         binding.textView.text = str     }     // called by Buttton tapping     fun showTimePickerDialog(v: View) {         val newFragment = TimePick()         newFragment.show(supportFragmentManager, "timePicker")     } }  | 
					
 
DialogFragment にあった
onTimeSet() を持ってきてデータを受け取ります
 
レイアウトです
activity_main.xml
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37  | 
						<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout      xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     tools:context=".MainActivity">     <TextView         android:id="@+id/textView"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:gravity="center"         android:text="@string/no_data"         android:textSize="50sp"         android:textColor="#000"         app:layout_constraintBottom_toBottomOf="parent"         app:layout_constraintLeft_toLeftOf="parent"         app:layout_constraintRight_toRightOf="parent"         app:layout_constraintTop_toTopOf="parent"         app:layout_constraintVertical_bias="0.4"/>     <Button         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:onClick="showTimePickerDialog"         android:layout_margin="30dp"         android:text="@string/pick_time"         app:layout_constraintBottom_toBottomOf="parent"         app:layout_constraintLeft_toLeftOf="parent"         app:layout_constraintRight_toRightOf="parent"         app:layout_constraintTop_toTopOf="parent"         app:layout_constraintVertical_bias="0.6"/> </androidx.constraintlayout.widget.ConstraintLayout>  | 
					
 
リソース
strings.xml
| 
					 1 2 3 4 5 6  | 
						<resources>     <string name="app_name">TestTimePicker</string>     <string name="no_data">"No Data"</string>     <string name="pick_time">Pick Time</string>     <string name="stringformat">%02d:%02d</string> </resources>  | 
					
 
build.gradle
| 
					 1 2 3 4 5 6 7 8  | 
						... android {     ...     buildFeatures {         viewBinding true     } } ...  | 
					
Reference:
Picker API Developer’s Guide | Picker | Google Developers