Android: DatePickerDialog и TimePickerDialog не проходят отбор
Существует проблема как с DatePickerDialog, так и с TimePickerDialog. Пользователь может выбрать дату и время с помощью кнопок плюс или минус. Эта работа. Но когда пользователь нажимает на поле, он может установить значение с помощью клавиатуры:
Но это совсем не работает. Когда пользователь вводит новое значение и нажимает кнопку "ОК", значение текущего выбранного поля не будет передано методу. Это не работает ни в
DatePickerDialog, ни в TimePickerDialog. Вместо этого пользователю нужно нажать зеленую кнопку вперед на клавиатуре, чтобы действительно установить значение в DatePickerDialog. Когда он нажимает "OK", то значение передается, но это довольно идиотское удобство использования. Никто бы этого не сделал. Вот как я реализую фрагменты: 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);
}
}
У кого-нибудь была такая же проблема и уже реализован какой-то быстрый обходной путь? (Я бы предпочел не переосмысливать все диалоги выбора, только этой наполовину испеченной реализации).
2 ответов:
Я нашел обходной путь для
DatePickerDialog, чтобы отключить клавиатуру, поэтому пользователь не может ввести дату с помощью клавиатуры. (см. также [отключить ввод с клавиатуры на 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, поэтому я использовал другой обходной путь для выбора времени, благодаря майку м.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); } }
Это сработало для меня:
@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(); } }

Comments