2010-01-12 25 views
45

Hay un detector de eventos en Android llamado DatePicker.OnDateChangedListener. Estoy tratando de establecer en la fecha cambiado oyente de una vista DatePicker de la siguiente manera:Android - OnDateChangedListener - ¿cómo se configura esto?

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

Pero sabe qué? El selector de fecha no tiene un método llamado setOnDateChangedListener.

Mi pregunta es:

  1. Entonces, ¿cómo se establece una fecha cambió oyente en Android?
  2. Si no es posible configurar un oyente con fecha cambiada, ¿cuál es el propósito de este evento?

Cualquier documentación/tutorial será de mucha ayuda.

Respuesta

92

Una vez que haya creado su DatePicker, debe inicializarlo con la fecha que desea mostrar al principio. Ese es el punto en el que puede agregar su oyente.

Ver DatePicker.init(int, int, int, OnDateChangedListener).

+87

El Android API es realmente algo. Me pregunto a quién se le ocurrió este enfoque ridículo – Tawani

+1

No me parece ridículo, y al menos está en los documentos de la API. De todos modos, me imagino que la razón es porque los widgets de Android generalmente tienen varios constructores, para cuando deseas controlar qué estilo y atributos de diseño deberían crearse, así que han seguido esa convención en lugar de crear numerosos constructores con muchos parámetros. –

+4

Parece apropiado tener un método setOnDateChangedListener() como el presente para establecer un escucha de clic. Me pregunto por qué te hacen inicializarlo en una fecha en la que se inicializa automáticamente para ti hoy. –

11

Este punto de vista es en realidad una combinación de cuatro puntos de vista, y que son:

Tres hilanderas

Una CalendarView

A partir del OnDateChangeListener, el objeto que ha pasado en el método init simplemente pase al contenido de CalendarView, y creo que usted sabe que hay un método setOnDateChangeListener en el buen viejo CalendarView ...... ......

En la clase DatePicker, hay un método llamado getCalendarView, y es el método al que puede llamar si quiere tener en sus manos el contenido de CalendarView.

Una vez que tenga en sus manos el CalendarView contenida, a continuación, sin necesidad de decir, puede llamar a su setOnDateChangeListener

+3

Esta es una gran solución para una terrible API. Gracias por esto, ¡acabas de salvar mi tocino! – sleeke

+0

datePicker.getCalendarView(). SetOnDateChangeListener() funciona totalmente! ¡Gracias! No es muy intuitivo. Todavía creo que la API debería haber sido datePicker.setOnDateChangeListner(). – ONE

7

Algo como esto:

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

Da UnsupportedOperationException: CalendarView no existe para DatePicker –

+1

Infla un DatePicker con android: datePickerMode = "spinner" y ese Listener funcionó para mí. Sin ninguna explicación lógica ... – user2331454

30

mejor manera es

 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

Buen ejemplo. Gracias. –

Cuestiones relacionadas