在 Kotlin Android 中设置日期并从 Material 日期选择器获取日期

Set date and get Date from Material Date Picker in Kotlin Android

我正在学习 kotlin,目前我知道的不多,我想更改我拥有的日期选择器 Material,问题是我不知道如何将数据传递给这个新的日期选择器。

这是我目前拥有的:

fecha = view.findViewById(R.id.fecha)
fecha?.setOnClickListener {
  fecha!!.error = null
  val dateSetListener = DatePickerDialog(requireContext(), { _, year, monthOfYear, dayOfMonth ->
   cal.set(Calendar.YEAR, year)
   mYear = year
   cal.set(Calendar.MONTH, monthOfYear)
   mMonth = monthOfYear
   cal.set(Calendar.DAY_OF_MONTH, dayOfMonth)
   mDay = dayOfMonth
   updateDateInView()
}, mYear, mMonth, mDay)
  dateSetListener.datePicker.maxDate = System.currentTimeMillis()
  dateSetListener.show()
}

fun updateDateInView() {
   val myFormat = "dd/MM/yyyy"
   val sdf = SimpleDateFormat(myFormat)
   fecha?.setText(sdf.format(cal.time))
}

我想做成这样,但是我不知道如何传递和保存值,有人可以帮我吗?

val datePicker = MaterialDatePicker.Builder.datePicker().build()

MaterialDatePicker 接受 CalendarConstraints 在某个月份打开日期选择器。 CalendarConstraints 接受 timeInMilliseconds 在特定月份打开日历。 MaterialDatePicker 有一个 addOnPositiveButtonClickListener 方法,其 lambda returns 用户做出选择后 milliseconds 中的时间。

您可以像这样创建MaterialDatePicker

val myFormat = "dd/MM/yyyy"
val formattedDate = "01/01/2000"

val sdf = SimpleDateFormat(myFormat)
val date = sdf.parse(formattedDate)
val timeInMillis = date.time

val constraintBuilder = CalendarConstraints.Builder().setOpenAt(
    timeInMillis //pass time in milli seconds 
).build()

val picker = MaterialDatePicker.Builder.datePicker()
    .setTitleText("Select Date")
    .setCalendarConstraints(constraintBuilder)
    .build()

picker.addOnPositiveButtonClickListener {
    val date = Date(it)
    val formattedDate = sdf.format(date) // date selected by the user
}

// show picker using this
picker.show(requireActivity().supportFragmentManager, "materialDatePicker")

而不是使用 SimpleDateFormatter,您应该使用 Java8

中提供的 LocalDateTime API

使用LocalDateTime API,你可以这样做

val dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale.getDefault())
val formattedDate = "01/01/2000"
val timeInMillis = LocalDate.parse(formattedDate, dateFormatter)
                    .atStartOfDay(ZoneId.systemDefault())
                    .toInstant()
                    .toEpochMilli()
                

您可以将此 timeInMillis 传递给 CalendarConstraintSetsetOpenAt() 方法。

获取用户选择后的日期

val timeInMillis = dateFormatter.format(
                    // it is the milliseconds received inside lambda of addOnPositiveButtonClickListener
                    Instant.ofEpochMilli(it) 
                        .atZone(ZoneId.systemDefault()).toLocalDate()
                )