.
一般显示日期选择对话框是这样子的:
Calendar c = Calendar.getInstance();
DatePickerDialog datePickerDialog = new DatePickerDialog(context, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
}
}, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
datePickerDialog.show();
点击上面的年份能切换年份,不过点击日期不能快速切换月份,只能左右滑动,慢慢切换。
点进去源码看了下,发现那个Textview所在布局为
R.layout.date_picker_header_material
里,id为date_picker_header_date
。因为那些id都在android源码里,应用的R为com.android.internal.R
,所以不能直接用常规的R.id.来获取View。网上看了下,主要有两种方法来获取id,一种是反射,一种是使用
android.content.res.Resources
。直接使用第二种:
Resources mResources = Resources.getSystem();
int iddd = mResources.getIdentifier("date_picker_header_date", "id", "android");
获取到id后就开始获取View:
final DatePicker datePicker = datePickerDialog.getDatePicker();
View view= datePicker.findViewById(iddd);
ppo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//在这边进行操作就行
//datePicker.updateDate(年,月,日);
}
});
设置view监听,然后模拟年份选择那样弄个RecyclerView盖住底下的日期表,选择后使用datePicker.updateDate(年,月,日)
;更新DatePicker 界面就可以了。注意:源码写了,月份是从0开始的,所以如果你要显示9月,传进去8就行。
/**这是源码:
* Update the current date.
* @param year The year.
* @param month The month which is <strong>starting from zero</strong>.
* @param dayOfMonth The day of the month.
*/
public void updateDate(int year, int month, int dayOfMonth) {
mDelegate.updateDate(year, month, dayOfMonth);
}
要修改这一切,记得都在datePickerDialog.show();
之前进行操作。
因为是别人项目的需求,所以只是寻找解决方案,没有做月份选择的列表,也没有demo。只是记录一下,怕下次自己也遇到了。
.
上面的操作时在7.0设备上操作的,能正常使用。但5.0却是另一种样式的。
因为之前看的源码是API25的,在5.0果然不能正常通过id找到View。建议多看看其他几个版本的源码,进去看看里面的ID名字。或者省点事,只在外部弄个大点的
try { } catch (Exception e) { }
进行包裹,这样目标版本能正常就行。当然,很无聊,又不想看源码也可以循环获取里面的View来进行操作。
//这只是无聊的操作,不建议这样。
final DatePicker datePicker = datePickerDialog.getDatePicker();
LinearLayout childAt0 = (LinearLayout) datePicker.getChildAt(0);
LinearLayout childAt1 = (LinearLayout) childAt0.getChildAt(0);
LinearLayout childAt2 = (LinearLayout) childAt1.getChildAt(1);
LinearLayout childAt3 = (LinearLayout) childAt2.getChildAt(1);
View view =childAt3.getChildAt(0);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//在这边进行操作就行
//datePicker.updateDate(年,月,日);
}
});
.
最后,像这种奇葩功能,建议是拒接接受。