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», вы сможете получить «TimePicker», используя метод, аналогичный методу, показанному в [ этот ответ] (http://stackoverflow.com/a/39071972). Вместо этого вы вызываете 'findViewById()' на свой 'TimePickerDialog', используйте' 'timePicker'' вместо' 'ampm_layout'', а возвращаемый' View' должен быть 'TimePicker'. (Очевидно, вы опустите видимость.) Возможно, вам нужно будет сделать это в методе 'onStart()' Fragment', чтобы убедиться, что сначала все было правильно инициализировано правильно. –

+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, так что я использовал другой обходной путь для времени пипетка, благодаря Mike 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(); 
    } 
} 
Смежные вопросы