本帖最后由 破解project 于 2020-3-8 17:12 编辑
这部分作为一个笔记记录下来。
Bug1
对于Android的DatePickerDialog(日期选择框)组件,有两类构造器。一类是level 1时就存在的将日期和设定监听器一起传入初始值的,一类是level 24添加的基本只需要context的。
由于项目需要,这里我是用的需要themeResId的构造器。两类构造器如下所示。
[Java] 纯文本查看 复制代码 /**
* Creates a new date picker dialog for the specified date.
*
* [url=home.php?mod=space&uid=952169]@Param[/url] context the parent context
* @param themeResId the resource ID of the theme against which to inflate
* this dialog, or {[url=home.php?mod=space&uid=295005]@Code[/url] 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 {[url=home.php?mod=space&uid=282837]@link[/url] Calendar#MONTH})
* @param dayOfMonth the initially selected day of month (1-31, depending
* on month)
*/
public DatePickerDialog(@NonNull Context context, @StyleRes int themeResId,
[url=home.php?mod=space&uid=1043391]@nullable[/url] 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(..)方法更新日期的时候在右端的日历组件不会生效。
效果请看附加图片。
触发示例代码:
[Java] 纯文本查看 复制代码 //Kotlin
val dialog = DatePickerDialog(this, null, /*<2*/0, 0, 0)
dialog.datePicker.updateDate(2019, 10, 21)
dialog.show()
使用新的构造器或者初始传参的时候使用其他值可以避开这个bug。
Bug2
从Android5.0开始,
[Java] 纯文本查看 复制代码 datePickerDialog.getDatePicker().setEnabled(false);
禁止用户修改日期的操作无效。仅仅能够禁止年标签点击事件
解决方法:
这个方法可以在Android 5.1和以上禁用操作。不过在Android 5.0上仅仅会让没有选择的日历日期文字部分变灰色,无法禁止选中操作。
[Java] 纯文本查看 复制代码 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中,使用默认深色主题展示会出现日历部分截断的情况。效果见附加图。
[Java] 纯文本查看 复制代码 // 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
|