2

DatePickerDialog和TimePickerDialog都存在問題。用戶可以使用加號或減號按鈕選擇日期和時間。這工作。但是,當用戶點擊進入該領域,他可以通過鍵盤設定值:Android:DatePickerDialog和TimePickerDialog未通過選擇

picker dialog

但是,這並不在所有的工作。當用戶鍵入一個新值並點擊「確定」按鈕時,當前選擇的字段的值不會被傳遞給onDateSet方法。這既不在DatePickerDialog也不在TimePickerDialog。相反,用戶需要點擊鍵盤上的綠色前進按鈕才能真正設置DatePickerDialog中的值。當他按下「確定」時,該值就通過了,但這是一個非常愚蠢的可用性。沒有人會這樣做。這是我如何實現的片段:

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener 
{ 
    private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     // Use the current date as the default date in the picker 
     final Calendar c = Calendar.getInstance(); 
     int year = c.get(Calendar.YEAR); 
     int month = c.get(Calendar.MONTH); 
     int day = c.get(Calendar.DAY_OF_MONTH); 

     // Create a new instance of DatePickerDialog and return it 
     return new DatePickerDialog(getActivity(), this, year, month, day); 
    } 

    @Override 
    public void onDateSet(DatePicker view, int year, int month, int day) 
    { 
     final Calendar calendar = Calendar.getInstance(Locale.getDefault()); 
     calendar.set(year, month, day); 
     String pickedDate = dateFormat.format(calendar.getTime()); 

     ((MenuEditActivity)getActivity()).setMenuDate(pickedDate); 
    } 

    @Override 
    public void onCancel(DialogInterface dialog) 
    { 
     super.onCancel(dialog); 
    } 
} 

有沒有人有同樣的問題,並已實施一些快速的解決方法? (我寧願不想重新實現整個Picker對話框,僅僅是這個不完整的實現)。

+0

嗯,我沒有觀察到你描述的行爲,但是如果你想用'TimePickerDialog'嘗試可聚焦技巧,你應該可以使用類似於[這個答案](http://stackoverflow.com/a/39071972)。你可以在'TimePickerDialog'上調用'findViewById()',而不是''ampm_layout''使用''timePicker'',返回的'View'應該是'TimePicker'。 (顯然,你會忽略可見性的東西。)你可能需要在'Fragment'的'onStart()'方法中做到這一點,以確保所有東西都已經被正確初始化。 –

+0

@MikeM。謝謝,它現在可以工作(請參閱我更新的問題)。如果你把它作爲答案發布,我可以接受它。順便說一句,這很奇怪。我昨天已經嘗試了類似的東西,但我總是得到空。也許是因爲我沒有在'onStart()'中做。 – Bevor

+0

沒問題。是的,我有機會更早地進行快速測試,並且它在'onCreateDialog()'中表現不佳。我沒有真正調查原因,但它在'onStart()'中工作得很好。 Anyhoo,你豐富的解決方案比我的小建議要好得多。您應該將這些編輯轉換爲答案。不過謝謝你。欣賞此優惠。乾杯! –

回答

2

我找到了解決方法DatePickerDialog禁用鍵盤,因此用戶不能鍵入日期。 (見[Disable keyboard input on Android TimePicker

public class MyDatePickerDialog extends DatePickerDialog 
    { 
     public MyDatePickerDialog(Context context, OnDateSetListener listener, int year, int month, int dayOfMonth) 
     { 
      super(context, listener, year, month, dayOfMonth); 
     } 

     @NonNull 
     @Override 
     public DatePicker getDatePicker() 
     { 
      return super.getDatePicker(); 
     } 
    } 
在片段

....

final MyDatePickerDialog datePickerDialog = new MyDatePickerDialog(getActivity(), this, year, month, day); 
datePickerDialog.getDatePicker().setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS); 

但是,這是不可能的TimePickerDialog因爲沒有方法來獲得TimePicker,所以我用另一種解決方法的時間選擇器,這要歸功於邁克M.

public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener 
{ 
    private TimePickerDialog timePickerDialog; 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     //Default 6:00 
     timePickerDialog = new TimePickerDialog(getActivity(), this, 6, 0, android.text.format.DateFormat.is24HourFormat(getActivity())); 

     return timePickerDialog; 
    } 

    @Override 
    public void onStart() 
    { 
     super.onStart(); 

     final View hourView = timePickerDialog.findViewById(Resources.getSystem().getIdentifier("hour", "id", "android")); 
     final View minuteView = timePickerDialog.findViewById(Resources.getSystem().getIdentifier("minute", "id", "android")); 

     if (hourView != null && hourView instanceof NumberPicker) 
     { 
      ((NumberPicker) hourView).setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS); 
     } 

     if (minuteView != null && minuteView instanceof NumberPicker) 
     { 
      ((NumberPicker) minuteView).setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS); 
     } 
    } 

    @Override 
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) 
    { 
     ((MenuEditActivity) getActivity()).setRecipeTime(hourOfDay, minute); 
    } 

    @Override 
    public void onCancel(DialogInterface dialog) 
    { 
     super.onCancel(dialog); 
    } 
} 
+0

不錯,徹底。當你可以的時候不要忘記接受。乾杯! –

+0

@MikeM。 SO迫使我等待一天,直到我能接受它。 – Bevor

+0

是的,我知道這是一兩天。雖然不確定。 –

0

這爲我工作:

@SuppressWarnings("deprecation") 
@Override 
public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) { 
    timePicker.requestFocus(); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     hour = timePicker.getHour(); 
     minute = timePicker.getMinute(); 
    } else { 
     hour = timePicker.getCurrentHour(); 
     minute = timePicker.getCurrentMinute(); 
    } 
}