如果使用了android:theme="@android:style/Theme.Light.NoTitleBar" 樣式的DateickerDialog,那麼顯示年月日的地方是EditText,是可以編輯的。
但是,在大多數手機上面,該EditText被修改後立即點選确定。那麼擷取到的年月日還是之前的年月日,我們沒能夠擷取到EditText修改後的實際資料。 我們可以巧妙地通過主動觸發焦點的改變,來使得DatePicker的年月日改變,那麼這樣我們再擷取到的DatePicker的年月日,就是修改後的年月日。
如下所示:
manifest.xml
application:
android:theme="@android:style/Theme.Light.NoTitleBar"
activity:
String TAG = getClass().getSimpleName();
DatePickerDialog datePickerDialog;
int year = 1990,month = 0,day = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
int realYear = year;
int realMonthOfYear = monthOfYear;
int realDayOfMonth = dayOfMonth;
Calendar cal = Calendar.getInstance();
try{
datePickerDialog.getDatePicker().requestFocus();
Log.d(TAG, "DatePickerDialog " + datePickerDialog.getDatePicker().getCalendarView().getDate());
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(datePickerDialog.getDatePicker().getCalendarView().getDate()));
realYear = calendar.get(Calendar.YEAR);
realMonthOfYear = calendar.get(Calendar.MONTH);
realDayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
Log.d(TAG,"year is :"+year+ "\tmonth is :"+month+"\tday is :"+day
+"\nrealYear is => "+realYear+"\trealMonth is =>"+realMonthOfYear+"\trealDayis =>"+realDayOfMonth);
}catch (Exception e){
Log.d(TAG,"DatePickerDialog "+e.toString());
}
}
},year,month,day);
datePickerDialog.show();
}
運作後直接把年的位置輸入1994(不要通過點選+-号改變數字),點選确定。
(部分手機沒有此問題,是以部分手機會在點選确定的時候把焦點跳到下一個EditText去!)
輸出結果如下:
04-04 14:50:24.969 8896-8896 D/MainActivity: DatePickerDialog 757407000477
04-04 14:50:24.970 8896-8896 D/MainActivity: year is :1990 month is :0 day is :1
ealYear is => 1994 realMonth is =>0 realDayis =>1
同理,TimePickerDialog也如此,需要把焦點改變。
但是TimePickerDialog并不能直接擷取到TimePicker,那麼我們可以通過反射的方式實作。
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view,
int hourOfDay, int minute) {
int realHourOfDay = hourOfDay;
int realMinute = minute;
Log.d(TAG,"======================>");
try {
Field mTimePicker = timePicker.getClass().getDeclaredField("mTimePicker");
mTimePicker.setAccessible(true);
TimePicker timePicker = (TimePicker) (mTimePicker.get(timePicker));
timePicker.requestFocus();
realHourOfDay = timePicker.getCurrentHour();
realMinute = timePicker.getCurrentMinute();
Log.d(TAG, "hourOfDay =>"+hourOfDay+"\t"+"minute =>"+minute+
"\nrealHourOfDay=>" + timePicker.getCurrentHour() + " realMinute=>" + timePicker.getCurrentMinute());
} catch (Exception e) {
Log.e(TAG,e.toString());
}
}
}