单独弹出设置一大堆东西好吧!!自定义一个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的转换也很关键哦!!