关于DatePickerDialog的一些bug
本帖最后由 破解project 于 2020-3-8 17:12 编辑这部分作为一个笔记记录下来。
Bug1
对于Android的DatePickerDialog(日期选择框)组件,有两类构造器。一类是level 1时就存在的将日期和设定监听器一起传入初始值的,一类是level 24添加的基本只需要context的。
由于项目需要,这里我是用的需要themeResId的构造器。两类构造器如下所示。
/**
* Creates a new date picker dialog for the specified date.
*
* @Param context the parent context
* @param themeResId the resource ID of the theme against which to inflate
* this dialog, or {@Code 0} to use the parent
* {@code context}'s default alert dialog theme
* @param listener the listener to call when the user sets the date
* @param year the initially selected year
* @param monthOfYear the initially selected month of the year (0-11 for
* compatibility with {@link Calendar#MONTH})
* @param dayOfMonth the initially selected day of month (1-31, depending
* on month)
*/
public DatePickerDialog(@NonNull Context context, @StyleRes int themeResId,
@nullable OnDateSetListener listener, int year, int monthOfYear, int dayOfMonth) {
//implement
}
/**
* Creates a new date picker dialog for the current date.
*
* @param context the parent context
* @param themeResId the resource ID of the theme against which to inflate
* this dialog, or {@code 0} to use the parent
* {@code context}'s default alert dialog theme
*/
public DatePickerDialog(@NonNull Context context, @StyleRes int themeResId) {
//implement
}
在8.0及其以上系统(目前至10),如果在使用旧版本的构造器并且输入奇怪的日期值(比如0,0,0,目前经过几次尝试,年份小于2的都不行)。然后之后使用getdatePicker().updateDate(..)方法更新日期的时候在右端的日历组件不会生效。
效果请看附加图片。
触发示例代码:
//Kotlin
val dialog = DatePickerDialog(this, null, /*<2*/0, 0, 0)
dialog.datePicker.updateDate(2019, 10, 21)
dialog.show()
使用新的构造器或者初始传参的时候使用其他值可以避开这个bug。
Bug2
从Android5.0开始,
datePickerDialog.getDatePicker().setEnabled(false);
禁止用户修改日期的操作无效。仅仅能够禁止年标签点击事件
解决方法:
这个方法可以在Android 5.1和以上禁用操作。不过在Android 5.0上仅仅会让没有选择的日历日期文字部分变灰色,无法禁止选中操作。
long now = System.currentTimeMillis();
datePicker.setEnabled(false);
datePicker.setMaxDate(now);
datePicker.setMinDate(now);
参考自
https://stackoverflow.com/a/37618150
https://stackoverflow.com/a/20971151
Bug 3
在Android 5.0中,使用默认深色主题展示会出现日历部分截断的情况。效果见附加图。
// Use android.R.style.Theme_DeviceDefault_Dialog_Alert in API Level 22.
val themeResId = AlertDialog.THEME_DEVICE_DEFAULT_DARK
解决方法:```
android.R.style.Theme_Material_Dialog
``` 日。没事就被@ 这个用户名被全站检索的机制服了 添加一个新的bug。
作为备用附加一个链接:https://www.jianshu.com/p/6700e0422e6e 添加Bug 2的解决方案。 因为观察上的疏忽,漏了Bug2的一种行为。现在已经补充。
页:
[1]