〈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") } }