ホーム
2022.9.20

kotlin 日付選択ダイアログ

DatePickerFragment.kt を作成し、MainActivity.kt で使用します。
日付を選択したらテキストビューに選択した日付を表示しています。

DatePickerFragment.kt

package com.example.sampledatetimepickerdialog

import android.app.DatePickerDialog
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.widget.DatePicker
import androidx.fragment.app.DialogFragment
import java.util.*

class DatePickerFragment: DialogFragment(), DatePickerDialog.OnDateSetListener { // *1

interface Listener {
fun onDataSet(year: Int, month: Int, day: Int)
}

private lateinit var listener: Listener

override fun onAttach(context: Context) { // *2
super.onAttach(context)
when {
parentFragment is Listener -> listener = parentFragment as Listener
context is Listener -> listener = context
}
}

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(requireActivity(), this, year, month, day) // *3
}

override fun onDateSet(p0: DatePicker?, year: Int, month: Int, day: Int) { // *4
listener.onDataSet(year, month, day)
}
}
  1. DialogFragment()とDatePickerDialog.OnDateSetListenerを継承します。
  2. onAttachで呼び出し元をlistenerとして取得しています。
  3. onCreateDialogでDatePickerDialogのインスタンスを返しています。
  4. DatePickerDialog.OnDateSetListenerを継承しているのでonDateSetをオーバーライドしています。
    実際の処理は呼び出し元で定義しています。

* 公式はこちらです。

MainActivity.kt

package com.example.sampledatetimepickerdialog

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.sampledatetimepickerdialog.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity(), DatePickerFragment.Listener { // *1
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

binding.btnDatePicker.setOnClickListener { // *2
val datePicker = DatePickerFragment()
datePicker.show(supportFragmentManager, "Date picker dialog")
}
}

override fun onDataSet(year: Int, month: Int, day: Int) { // *3
val m = (month + 1).toString().padStart(2, '0')
val d = day.toString().padStart(2, '0')
val str = "$year-$m-$d"
binding.txvSample.text = str
}

}
  1. 作成したDatePickerFragmentのListenerを継承します。
  2. テスト用ボタンが押された時にDatePickerFragmentのshowメソッドを実行しています。
  3. onDataSetをオーバーライドします。DatePickerFragmentで定義した関数です。
    日付が選択されたときに発生するので、ここで年月日の引数を利用して処理します。
ホーム