天天看點

不要再單獨彈出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的轉換也很關鍵哦!!