关于DatePicker这个控件的解析有以下几点:
1、首先是显示问题,在Android 3.0系统以后使用DatePicker控件会出现一堆和日期相关的界面,比如下图:
有没有发现,如果使用了这个控件,会占据你一整个页面,这个页面上别的控件都别想放了。如果我只想简单的显示年月日怎么办,非得用DatePickerDialog吗?那倒不必,有解决的办法,就是判断当前使用的SDK编译版本,如果在3.0及其以上就将CalendarViewShown设置为false,否则保持该属性为true,具体的实现方法如下:
DatePicker dp1;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
dp1.setCalendarViewShown(false);
}
else {
dp1.setCalendarViewShown(true);
}
}
2、其次是需要解决这个控件到日期文本的时间转换。当我们监听该控件的变化时,在控件的界面上显示的时间是对的,而当把这个时间显示到例如textview上就会出现问题,仔细看会发现其中的month会比当前的月份少1,甚至会出现0月的情况,查看DatePicker的源码会发现,源码中利用Calender类获得年月日,而Calender这个类计数月份的时候本来就是0-11之间的月份,如果要显示正确的月份,程序员需要手动调用calender.add(Calendar.MONTH, 1);方法。
3、怎么监听DatePicker控件的变化,实现new OnDateChangedListener()接口就可以实现了,其重载onDateChanged(DatePicker view, int year, int monthOfYear,int dayOfMonth) 方法的时候也会有月份少1的问题。接下来我会贴上完整的从DatePicker控件初始化到监听日期变化后获取正确日期的代码:
private void initData()
{
Calendar c =Calendar.getInstance();
year1 = c.get(Calendar.YEAR);
c.add(Calendar.MONTH, 1);
month1 = c.get(Calendar.MONTH);
day1 = c.get(Calendar.DAY_OF_MONTH);
tv1.setText(year1+"-"+month1+"-"+day1);
dp1.init(dp1.getYear(), dp1.getMonth(), dp1.getDayOfMonth(), new OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
year1 = year;
month1 = monthOfYear+1;
day1 = dayOfMonth;
StringBuffer lend_time = new StringBuffer();
lend_time.append(year1);
lend_time.append("-");
lend_time.append(month1);
lend_time.append("-");
lend_time.append(day1);
tv1.setText(lend_time);
}
});
}
上述代码可以直接拿去用了。