單獨彈出設定一大堆東西好吧!!自定義一個fragment,繼承自DialogFragment。
再在onCreateDialog裡設定監聽器和傳回Dialog對象就可以了。
下面是兩個執行個體:
class TimePickerFragment : DialogFragment() {
private val crimeDetailViewModel: CrimeDetailViewModel by activityViewModels()//共享viewmodel
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
super.onCreateDialog(savedInstanceState)
val crime = crimeDetailViewModel.crimeLiveData.value
val timePickerListener = TimePickerDialog.OnTimeSetListener{
_, hour, minute ->
val calendar1 = Calendar.getInstance()
calendar1.time = crime!!.date
calendar1.set(Calendar.HOUR, hour)
calendar1.set(Calendar.MINUTE, minute)
crime.date = calendar1.time
crimeDetailViewModel.saveCrime(crime)
}
val calendar = Calendar.getInstance()
calendar.time = crimeDetailViewModel.crimeLiveData.value?.date ?: Date()//
val initHour = calendar.get(Calendar.HOUR)
val initMinute = calendar.get(Calendar.MINUTE)
return TimePickerDialog(
requireContext(),
timePickerListener,
initHour,
initMinute,
true
)
}
}
class DatePickerFragment:DialogFragment() {
private val crimeDetailViewModel:CrimeDetailViewModel by activityViewModels()
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
super.onCreateDialog(savedInstanceState)
val dateListener = DatePickerDialog.OnDateSetListener{
_, year, month, dayOfMonth ->
val chooseDate: Date = GregorianCalendar(year, month, dayOfMonth).time//
val crime = crimeDetailViewModel.crimeLiveData.value
crime?.date = chooseDate
crimeDetailViewModel.saveCrime(crime!!)
}
val calendar = Calendar.getInstance()
calendar.time = crimeDetailViewModel.crimeLiveData.value?.date ?: Date()//
val initYear = calendar.get(Calendar.YEAR)
val initMonth = calendar.get(Calendar.MONTH)
val initDay = calendar.get(Calendar.DAY_OF_MONTH)
return DatePickerDialog(
requireContext(),
dateListener,
initYear,
initMonth,
initDay
)
}
}
另外,熟悉Date和Calendar的轉換也很關鍵哦!!