天天看點

DateickerDialog,TimePickerDialog修改EditText後無法擷取實際值

如果使用了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());
        }
    }
}      

繼續閱讀