0
0

More than 1 year has passed since last update.

この記事誰得? 私しか得しないニッチな技術で記事投稿!

Android、DatePickerDialogで日付、TimePickerDialogで時間の選択

Posted at

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じゃないと、うまく動きませんでした。

MainFragment.kt
    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で受け取ります。

DatePickerFragment.kt
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に置きました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0