不要再单独弹出dialog了!用fragment封装
单独弹出设置一大堆东西好吧!!自定义一个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的转换也很关键哦!!