阅读安卓DatePicker源码笔记

前言

我想将我的记账App的汇总页面时间选择功能改好看点,最好是像 DatePicker 那样可以下拉滚动时间。我自己是想不出具体怎么做的,所以就要学习一下 DatePicker 的源码。

相关代码位置

以下是和 DatePicker 相关的文件

文件路径 文件功能
SDK下面android/widget/DatePicker.java DatePicker 的源码实现,new方法和xml都是通过这个类构造DatePicker
SDK下面data/res/values/themes.xml DatePicker 三个参数的构造方法中,有个R.attr.datePickerStylexml默认就会按这个样式初始化 DatePicker
SDK下面data/res/values/styles.xml datePickerStyle 对应的就是 Widget.DatePicker
SDK下面data/res/layout/date_picker_legacy.xml Widget.DatePicker里面的legacyLayout就是这个文件
SDK下面data/res/values/attrs.xml 搜索DatePicker可以看到DatePicker类下面有哪些属性

观察date_picker_legacy.xml,可以看到它由三个NumberPicker组成,所以我还需要看NumberPicker相关的文件

文件路径 文件功能
SDK下面android/widget/NumberPicker.java NumberPicker 的源码实现
SDK下面data/res/values/themes.xml NumberPicker三参数构造方法中,有个numberPickerStyle,XML默认会按这个样式初始化 NumberPicker
SDK下面data/res/values/styles.xml numberPickerStyle对应的就是Widget.NumberPicker
SDK下面data/res/layout/number_picker.xml Widget.NumberPicker里面的internalLayout就是这个文件
SDK下面data/res/values/attrs.xml 搜索NumberPicker可以看到NumberPicker类下面有哪些属性

观察number_picker.xml,它是由上边ImageButton,中间EditText,下边ImageButton组成

大体流程

我在activity_test.xml中使用了DatePicker,如下所示

    <DatePicker
        android:id="@+id/date_picker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:datePickerMode="spinner"
        android:calendarViewShown="false"
        />

这里android:datePickerMode="spinner"表示我需要开启下拉模式的日期选择,android:calendarViewShown="false"表示不要显示日历模式的日期选择

然后进入到DatePicker类,看四个参数的构造方法。在构造方法中,取出datePickerMode属性的值,因为我设置的是spinner,所以会进入到mDelegate = createSpinnerUIDelegate(context, attrs, defStyleAttr, defStyleRes);

然后查看DatePickerSpinnerDelegate类,这个类的内容太复杂了,我随便写点
首先是获取各种属性,例如spinnerShowncalendarViewShownstartYearendYearminDatemaxDatelegacyLayout
其中legacyLayout是layout文件,通过LayoutInflater膨胀成一个View,将这个View中的daymonthyear这三个NumberPicker存下来,后面会调整顺序
日期这边会根据最小和最大时间设置对应的NumberPicker,逻辑太多了,我就不写了。
然后还有NumberPicker数据变更事件,也会根据最小和最大时间调整

我差不多就只能看懂这些了。后面我应该直接拿NumberPicker来做年月日时分秒选择器

posted @ 2025-03-07 21:32  hellozjf  阅读(35)  评论(0)    收藏  举报