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);
}
}


У кого-нибудь была такая же проблема и уже реализован какой-то быстрый обходной путь? (Я бы предпочел не переосмысливать все диалоги выбора, только этой наполовину испеченной реализации).

459   2  

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

    Ничего не найдено.