在 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
传递给 CalendarConstraintSet
的 setOpenAt()
方法。
获取用户选择后的日期
val timeInMillis = dateFormatter.format(
// it is the milliseconds received inside lambda of addOnPositiveButtonClickListener
Instant.ofEpochMilli(it)
.atZone(ZoneId.systemDefault()).toLocalDate()
)
我正在学习 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
传递给 CalendarConstraintSet
的 setOpenAt()
方法。
获取用户选择后的日期
val timeInMillis = dateFormatter.format(
// it is the milliseconds received inside lambda of addOnPositiveButtonClickListener
Instant.ofEpochMilli(it)
.atZone(ZoneId.systemDefault()).toLocalDate()
)