TimePickerDialogで未来時刻が選択出来ないようにしようと思った。
しかし...
実装方法を探しに探したが、全く見つからぬ٩( ᐛ )و
そして私は MaterialDateTimePicker というライブラリに出会った。
実装してみる
- build.gradleのdependenciesに以下を追加
implementation 'com.wdullaer:materialdatetimepicker:4.2.3'
- MaterialDateTimePickerを表示してみる(ボタンをクリックしたらダイアログが表示されるようにしています)
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<Button>(R.id.show_timepicker_button).setOnClickListener {
clickButton()
}
}
private fun clickButton() {
// TimePickerDialogのOKをクリックした時に呼ばれる。
// キャンセルや画面をクリックしてDialogを終了した時には呼ばれない
val callback = TimePickerDialog.OnTimeSetListener { view, hourOfDay, minute, second ->
// 選択した時間を取得して、何らかの処理を行う
}
val cal = Calendar.getInstance()
TimePickerDialog.newInstance(
callback,
cal.get(Calendar.HOUR_OF_DAY),
cal.get(Calendar.MINUTE),
false
).show(supportFragmentManager, TAG)
}
companion object {
private const val TAG = "MainActivity"
}
}
表示された( ´∀`)
未来時刻が選択出来ないようにする
val cal = Calendar.getInstance()
val hour = cal.get(Calendar.HOUR_OF_DAY)
val minute = cal.get(Calendar.MINUTE)
TimePickerDialog.newInstance(callback, hour, minute, false).apply {
// 現在の時刻を上限に設定する
val timepoint = Timepoint(hour, minute)
setMaxTime(timepoint)
}.show(supportFragmentManager, TAG)
未来時刻が選択出来ないようになりました
その他の設定
- MaterialDateTimePickerのデザインを変更
TimePickerDialog.newInstance(callback, hour, minute, false).apply {
// TimePickerDialogのカラーを設定
accentColor = ContextCompat.getColor(this@MainActivity, R.color.colorAccent)
// OKボタンの文言を設定
setOkText("よしっ!")
// OKボタンのカラーを設定
setOkColor(ContextCompat.getColor(this@MainActivity, R.color.colorAccent))
// キャンセルボタンの文言を設定
setCancelText("あかん")
// キャンセルボタンのカラーを設定
setCancelColor(ContextCompat.getColor(this@MainActivity, android.R.color.darker_gray))
}.show(supportFragmentManager, TAG)
- TimePickerDialog.newInstanceのis24HourModeをtrueにすると24時間表示になる