Androidで日付の選択、時間の選択
アプリで日付を入力するEditTextを作成する機会があったって、手入力もダルいので、DatePickerDialogで日付、TimePickerDialogで時間の選択できるようなサンプルを作ってみました。よくある、こんなやつでね。
以下のQiita記事を参考にさせていただきました。ActivityからDatePickerDialog、TimePickerDialogが呼ばれる場合は、このサンプルの通りでよいですが、Fragmentから呼ばれる場合はFragmentManagerにひと捻りが必要です。
FragmentからDatePickerDialog、TimePickerDialogを呼ぶ場合
通常AndroidアプリはActivityが1個で、Fragmentが複数で1対多の関係。Fragmentをクルクル入れ替えて画面遷移するケースが多いと思います。従って、DatePickerDialog、TimePickerDialogも、Activityじゃなくて、Fragmentから呼ばれます。
Fragmentから呼び出す場合、呼び元から渡す引数のFragmentManagerはparentFragmentManagerだとうまく動きません。(MainActivityが渡される)
ここはchildFragmentManagerじゃないと、うまく動きませんでした。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.dateBtn.setOnClickListener {
DatePickerFragment().show(childFragmentManager, "DatePicker")
}
binding.timeBtn.setOnClickListener {
TimePickerFragment().show(childFragmentManager, "TimePicker")
}
}
DatePickerDialog、TimePickerDialogを表示するFragment側(wrapしている)はonAttach関数で親のFragmentの受け取り方がちょっと違います。parentFragmentで受け取ります。
class DatePickerFragment(): DialogFragment(), DatePickerDialog.OnDateSetListener {
interface OnSelectedDateListener {
fun selectedDate(year: Int, month: Int, dayOfMonth: Int)
}
private lateinit var listener: OnSelectedDateListener
override fun onAttach(context: Context) {
super.onAttach(context)
if (parentFragment is OnSelectedDateListener) {
listener = parentFragment as OnSelectedDateListener
}
}
・・・
}
最後に
全体のソースはgitHubに置きました。