2010-01-12 4 views
45

C'è un listener di eventi in Android chiamato DatePicker.OnDateChangedListener. Sto cercando di impostare alla data cambiato ascoltatore di una vista DatePicker come segue:Android - OnDateChangedListener - come si imposta?

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

Ma indovinate un po '? Il selettore di date non ha un metodo chiamato setOnDateChangedListener.

La mia domanda è:

  1. Come poi si fa a impostare una data modificata ascoltatore in Android?
  2. Se non è possibile impostare un listener di data modificata, qual è lo scopo di questo evento?

Qualsiasi documentazione/tutorial sarà molto utile.

risposta

92

Una volta creato il vostro DatePicker, è necessario inizializzare con la data che si desidera visualizzare in un primo momento. Questo è il punto in cui puoi aggiungere il tuo ascoltatore.

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

+87

Il L'API di Android è davvero qualcosa. Mi chiedo chi sia il risultato di questo approccio ridicolo – Tawani

+1

Non mi sembra ridicolo, e almeno è nei documenti API. Ad ogni modo, immagino che il motivo sia perché i widget Android di solito hanno diversi costruttori, per quando si desidera controllare quali attributi di stile e layout con cui dovrebbe essere creato, quindi hanno mantenuto quella convenzione piuttosto che creare numerosi costruttori con molti parametri. –

+4

Sembra appropriato avere un metodo setOnDateChangedListener() come è presente per impostare un listener di clic. Mi chiedo perché ti fanno inizializzare a una data in cui l'auto si inizializza automaticamente per te? –

11

Questo punto di vista è in realtà una combinazione di quattro viste, e sono:

Tre Spinners

Uno CalendarView

Alla OnDateChangeListener, l'oggetto è stato passato nel metodo init semplicemente passato al CalendarView contenuto, e credo che tu sappia che c'è un metodo setOnDateChangeListener nel buon vecchio CalendarView ...... ......

Nella classe DatePicker, c'è un metodo chiamato getCalendarView, ed è il metodo che puoi chiamare se vuoi mettere le mani sul CalendarView contenuto.

Dopo aver ottenuto le mani sul CalendarView contenuta, quindi, inutilmente a dire, è possibile chiamare il suo setOnDateChangeListener

+3

Questo è un ottimo modo per aggirare una terribile API. Grazie per questo - hai appena salvato il mio bacon! – sleeke

+0

datePicker.getCalendarView(). SetOnDateChangeListener() funziona totalmente! Grazie! Tuttavia non è molto intuitivo. Continuo a pensare che l'API avrebbe dovuto essere datePicker.setOnDateChangeListner(). – ONE

7

Qualcosa di simile a questo:

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

Fornisce UnsupportedOperationException: CalendarView non esiste per DatePicker –

+1

Gonfia un DatePicker con android: datePickerMode = "spinner" e che Listener ha funzionato per me. Senza alcuna spiegazione logica ... – user2331454

30

modo migliore è

 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

Bel esempio. Grazie. –