如何解决带有数字月份而不是命名的 Spinner DatePicker
我有一个基本的 DatePicker
,它是微调样式,没有任何布局。它看起来像这样:
class DatePickerFragment: DialogFragment(),DatePickerDialog.OnDateSetListener {
private lateinit var date: Date
interface Callbacks {
fun onDateSelected(date: Date)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
date = arguments?.getSerializable(ARG_DATE) as Date
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val calendar = Calendar.getInstance().apply {
time = date
}
val initialYear = calendar.get(Calendar.YEAR)
val initialMonth = calendar.get(Calendar.MONTH)
val initialDay = calendar.get(Calendar.DAY_OF_MONTH)
return DatePickerDialog(
requireContext(),this,initialYear,initialMonth,initialDay
)
}
override fun onDateSet(view: DatePicker?,year: Int,month: Int,dayOfMonth: Int) {
val selectedDate = GregorianCalendar(year,month,dayOfMonth).time
targetFragment?.let { fragment ->
(fragment as Callbacks).onDateSelected(selectedDate)
}
}
companion object {
fun getInstance(date: Date): DatePickerFragment {
return DatePickerFragment().apply {
arguments = Bundle().apply {
putSerializable(ARG_DATE,date)
}
}
}
}
}
private const val ARG_DATE = "date"
选择器正常工作。问题在于它显示月份名称(三字母格式),请参阅:
如何让 DatePicker 以数字方式显示月份(两位数格式)? 换句话说,它会显示为 Mar
而不是 03
。理想情况下,如果可能,我希望避免实现自定义微调器。
解决方法
您可以通过从 DatePicker 中找到月份 NumberPicker 并将显示的值设置为数字字符串来实现这一点。
进行以下更改:
1.在 onCreateDialog(savedInstanceState: Bundle?)
中使用自定义样式创建您的 DatePickerDialog,如下所示:
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val calendar = Calendar.getInstance().apply {
time = date
}
val initialYear = calendar.get(Calendar.YEAR)
val initialMonth = calendar.get(Calendar.MONTH)
val initialDay = calendar.get(Calendar.DAY_OF_MONTH)
val mPickerDialog: DatePickerDialog = object : DatePickerDialog(requireContext(),R.style.MyDatePickerDialogStyle,this,initialYear,initialMonth,initialDay) {
override fun onDateChanged(view: DatePicker,year: Int,month: Int,dayOfMonth: Int) {
super.onDateChanged(view,year,month,dayOfMonth)
setNumericMonth(view)
}
}
setNumericMonth(mPickerDialog.datePicker)
return mPickerDialog
}
其中 R.style.MyDatePickerDialogStyle
是用于设置 Spinner Style 的自定义样式,如下所示:
<style name="MyDatePickerDialogStyle" parent="android:Theme.Material.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
<style name="MyDatePickerStyle" parent="android:Widget.Material.DatePicker">
<item name="android:datePickerMode">spinner</item>
</style>
2.在 DatePickerFragment
中使用以下辅助函数将月份设置为数字,如下所示:
private fun setNumericMonth(datePicker: DatePicker) {
val monthNumbers = arrayOf("01","02","03","04","05","06","07","08","09","10","11","12")
val monthPicker = getMonthNumberPicker(datePicker)
if (monthPicker != null) {
monthPicker.displayedValues = monthNumbers
}
}
private fun getMonthNumberPicker(datePicker: DatePicker?): NumberPicker? {
try {
if (datePicker != null && datePicker.childCount > 0 && datePicker.getChildAt(0) is ViewGroup) {
val vg = datePicker.getChildAt(0) as ViewGroup
if (vg.childCount > 0 && vg.getChildAt(0) is ViewGroup) {
val vgPickers = vg.getChildAt(0) as ViewGroup
for (i in 0 until vgPickers.childCount) {
if (vgPickers.getChildAt(i) is NumberPicker && i == 1) {
return vgPickers.getChildAt(i) as NumberPicker
}
}
}
}
} catch (e: Exception) {
}
return null
}
结果:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。