Выбор даты с возможностью отмены в Android

Возможно ли иметь средство выбора даты/времени с параметрами «Отменить/Установить» вместо одной команды «Установить». Мой вариант использования заключается в том, что когда я нажимаю на средство выбора даты, а поле не является обязательным, я могу очистить выбранное значение. Мой код выглядит примерно так:

private DatePickerDialog datePicker = null;

datePicker = new DatePickerDialog(getContext(), new DateSetListener(), year, monthOfYear, dayOfMonth);

person lokoko    schedule 18.12.2012    source источник
comment
Не пробовал, но это должно быть возможно, для этого вам нужно расширить кнопку отмены и в этом реализовать свою собственную функцию кнопки отмены.   -  person Usman Kurd    schedule 18.12.2012
comment
Стандарт на Android — нажать системную кнопку «Назад», чтобы отменить диалоги — прослушиватель не будет запущен.   -  person ataulm    schedule 18.12.2012
comment
@ataulm Даже если я это сделаю, выбранная дата не будет очищена.   -  person lokoko    schedule 18.12.2012
comment
@lokoko что такое DateSetListener()? В имеющемся у меня SDK используется DatePickerDialog.OnDateSetListener(), как в этом примере: mkyong.com /android/android-дата-выбор-пример   -  person ataulm    schedule 18.12.2012
comment
DateSetListener() — это собственный класс, реализующий DatePickerDialog.OnDateSetListener().   -  person lokoko    schedule 18.12.2012
comment
@ataulm есть ошибка на Android для проблемы с отменой. проверить отв.   -  person lokoko    schedule 05.02.2013


Ответы (3)


Я бы использовал простой диалог и включил в него DateTimePicker и кнопки SET и CANCEL или любую другую функциональность, которую вы хотели бы включить.

Другое решение UI/X, которое вы можете реализовать, — это отображение DateTimePicker по требованию (например, пользователь нажимает кнопку).

person Israel Tabadi    schedule 18.12.2012

Существует проблема с DatePickerDialog и TimePickerDialog (ошибка № 34833). Мы могли бы использовать счетчик в качестве обходного пути, чтобы избавиться от этой проблемы.

person lokoko    schedule 31.01.2013

Я знаю, что это последнее решение (я не хочу, чтобы кто-то тратил на это время), потому что это может выглядеть так.. (Спасибо https://stackoverflow.com/users/642161/dmon)

import android.app.DatePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.DatePicker;

import java.lang.reflect.Field;

/**
 * Created by root on 12/8/15.
 */
public class DatePickerDialogFragment extends DatePickerDialog {

public DatePickerDialogFragment(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) {
    super(context, null, year, monthOfYear, dayOfMonth);
    initializePicker(callBack);
}

public DatePickerDialogFragment(Context context,int theme,OnDateSetListener callBack,int year, int monthOfYear, int dayOfMonth)
{
    super(context, theme, null, year, monthOfYear, dayOfMonth);
    initializePicker(callBack);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setCancelable(false);
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    dismiss();

}

private void initializePicker(final OnDateSetListener callback) {
    try {
        //If you're only using Honeycomb+ then you can just call getDatePicker() instead of using reflection
        Field pickerField = DatePickerDialog.class.getDeclaredField("mDatePicker");
        pickerField.setAccessible(true);
        final DatePicker picker = (DatePicker) pickerField.get(this);
        this.setButton(DialogInterface.BUTTON_NEGATIVE, getContext().getText(android.R.string.cancel), (OnClickListener) null);
        this.setButton(DialogInterface.BUTTON_POSITIVE, getContext().getText(android.R.string.ok),
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        picker.clearFocus(); //Focus must be cleared so the value change listener is called
                        callback.onDateSet(picker, picker.getYear(), picker.getMonth(), picker.getDayOfMonth());
                    }
                });
    } catch (Exception e) { /* Reflection probably failed*/ }
}
}
person Boban    schedule 12.08.2015