阅读安卓DatePicker源码笔记
前言
我想将我的记账App的汇总页面时间选择功能改好看点,最好是像 DatePicker 那样可以下拉滚动时间。我自己是想不出具体怎么做的,所以就要学习一下 DatePicker 的源码。
相关代码位置
以下是和 DatePicker 相关的文件
| 文件路径 | 文件功能 |
|---|---|
SDK下面android/widget/DatePicker.java |
DatePicker 的源码实现,new方法和xml都是通过这个类构造DatePicker |
SDK下面data/res/values/themes.xml |
DatePicker 三个参数的构造方法中,有个R.attr.datePickerStyle,xml默认就会按这个样式初始化 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类,这个类的内容太复杂了,我随便写点
首先是获取各种属性,例如spinnerShown、calendarViewShown、startYear、endYear、minDate、maxDate、legacyLayout
其中legacyLayout是layout文件,通过LayoutInflater膨胀成一个View,将这个View中的day、month、year这三个NumberPicker存下来,后面会调整顺序
日期这边会根据最小和最大时间设置对应的NumberPicker,逻辑太多了,我就不写了。
然后还有NumberPicker数据变更事件,也会根据最小和最大时间调整
我差不多就只能看懂这些了。后面我应该直接拿NumberPicker来做年月日时分秒选择器

浙公网安备 33010602011771号