吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2045|回复: 4
收起左侧

[其他转载] 关于DatePickerDialog的一些bug

[复制链接]
破解project 发表于 2019-11-21 22:46
本帖最后由 破解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

错乱的DatePickerDialog

错乱的DatePickerDialog

日历截断

日历截断

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

nullable 发表于 2019-11-22 00:03
日。没事就被@ 这个用户名被全站检索的机制服了
 楼主| 破解project 发表于 2019-11-28 20:46
 楼主| 破解project 发表于 2019-12-2 18:52
 楼主| 破解project 发表于 2020-3-8 17:14
因为观察上的疏忽,漏了Bug2的一种行为。现在已经补充。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 07:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表