破解project 发表于 2019-11-21 22:46

关于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
```

nullable 发表于 2019-11-22 00:03

日。没事就被@ 这个用户名被全站检索的机制服了

破解project 发表于 2019-11-28 20:46

添加一个新的bug。

作为备用附加一个链接:https://www.jianshu.com/p/6700e0422e6e

破解project 发表于 2019-12-2 18:52

添加Bug 2的解决方案。

破解project 发表于 2020-3-8 17:14

因为观察上的疏忽,漏了Bug2的一种行为。现在已经补充。
页: [1]
查看完整版本: 关于DatePickerDialog的一些bug