天天看点

不要再单独弹出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的转换也很关键哦!!