2010-01-12 4 views
45

В Android есть прослушиватель событий DatePicker.OnDateChangedListener. Я пытаюсь установить на дату изменилось слушателя в целях Datepicker действуйте следующим образом:Android - OnDateChangedListener - как вы это устанавливаете?

DatePicker dp = new DatePicker(getContext()); 
dp.setOnDateChangedListener(this); 
//where this is my activity extends DatePicker.OnDateChangedListener 

Но знаете что? Дата выборщика не имеет метода под названием setOnDateChangedListener.

Мой вопрос:

  1. Как же установить дату изменили слушателя в Android?
  2. Если невозможно установить прослушиватель с измененной датой, какова цель этого события?

Любая документация/учебники будут очень полезными.

ответ

92

После того, как вы создали свой DatePicker, вам необходимо инициализировать его с датой, которую вы хотите отобразить вначале. Это тот момент, когда вы можете добавить слушателя.

См. DatePicker.init(int, int, int, OnDateChangedListener).

+87

Android API - это что-то. Интересно, кто придумал этот смехотворный подход? – Tawani

+1

Мне это не кажется смешным, и, по крайней мере, это в документах API. Во всяком случае, я думаю, причина в том, что у Android-виджетов обычно есть несколько конструкторов, поскольку, когда вы хотите контролировать, какие атрибуты стиля и макета должны быть созданы, - поэтому они придерживались этого соглашения, а не создавали многочисленные конструкторы со многими параметрами. –

+4

Кажется, у вас есть метод setOnDateChangedListener(), например, для установки прослушивателя кликов. Интересно, почему они заставляют вас инициализировать его до даты, когда он автоматически инициализирует вас сегодня? –

11

Эта точка зрения на самом деле сочетание четырех видов, и они:

Три Спиннерс

Один CalendarView

По состоянию на OnDateChangeListener, объект, который передается в метод инициализации будет просто передается содержащемуся CalendarView, и я считаю, что вы знаете, что существует метод setOnDateChangeListener в добром старом CalendarView ...... ......

В классе DatePicker существует метод называется getCalendarView, и это метод, который вы можете вызвать, если хотите получить доступ к содержащемуся CalendarView.

После того, как вы получите ваши руки на содержащемуся CalendarView, а затем, без необходимости говорить, что вы можете назвать его setOnDateChangeListener

+3

Это отличный обход для ужасного API. Спасибо за это - ты просто спас мою бекон! – sleeke

+0

datePicker.getCalendarView(). SetOnDateChangeListener() полностью работает! Благодаря! Не очень интуитивно. По-прежнему считайте, что API должен был быть datePicker.setOnDateChangeListner(). – ONE

7

Что-то вроде этого:

DatePicker myDatePicker = (DatePicker) findViewById(R.id.my_date_picker); 
myDatePicker.getCalendarView().setOnDateChangeListener(new CalendarView.OnDateChangeListener() { 
    @Override 
    public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) { 
     Log.d("tag", "finally found the listener, the date is: year " + year + ", month " + month + ", dayOfMonth " + dayOfMonth); 
    } 
}); 
+0

Это дает UnsupportedOperationException: CalendarView не существует для DatePicker –

+1

Надуйте DatePicker с помощью android: datePickerMode = «spinner», и этот прослушиватель работал для меня. Без каких-либо логических объяснений ... – user2331454

30

Лучший способ является

 DatePicker datePicker = (DatePicker) findViewById(R.id.datePicker); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 
     datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() { 

       @Override 
       public void onDateChanged(DatePicker datePicker, int year, int month, int dayOfMonth) { 
        Log.d("Date", "Year=" + year + " Month=" + (month + 1) + " day=" + dayOfMonth); 

       } 
      }); 
+2

Хороший пример. Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^