DatePicker w Androidzie

blog.lantkowiak.pl 8 lat temu

Kolejnym ekranem, nad którym będę pracował jest zaawansowane wyszukiwanie dokumentów. Przez słowo 'zaawansowane’ rozumiem coś więcej niż tylko wyszukiwanie po tagach, po których możemy wyszuiwać na głównym ekranie. Chcę dodatkow zaimplementować możliwość wyszukiwania po tytułach dokumentów czy po datach kiedy zostały dodane.

Właśnie do wyszukiwania po datach postanowiłem użyć datepicker’a.

W formularzu chcę mieć dwie kontrolki:

  • pole tekstowe, gdzie będzie można manualnie wpisać date
  • ikonka kalendarza, w którą jak klikniemy pojawi nam się nasz datepicker, a wybrana data zostanie zapisana we wcześniej wspomnianym polu tekstowym

Czyli na początku stworzyłem dwie wcześniej wspomniane kontrolki:

<EditText android:id="@+id/from_date" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="text" android:hint="form date" /> <Button android:id="@+id/form_date_datepicker" android:layout_width="25sp" android:layout_height="25sp" android:background="@android:drawable/ic_menu_my_calendar" android:onClick="datePicker" />

Pierwsza kontrolka to zwyczajne pole tekstowe. Druga kontrolka to przycisk, który po kliknięciu wywoła metodę datePicker. Metoda ta wygląda w następujący sposób:

def datePicker(view: View): Unit = { showDialog(datePickerCode) }

Gdzie datePickerCode jest zdefiniowanym w aplikacji kodem dla danej akcji czyli po prostu liczba typu Int.

Wywołanie metody showDialog(Int) wywoła metodę onCreateDialog, która u mnie wyglada następująco:

override protected def onCreateDialog(id: Int): Dialog = { if (id == datePickerCode) { val now = Calendar.getInstance() return new DatePickerDialog(this, new DateListener(findViewById(R.id.from_date).asInstanceOf[EditText]), now.get(Calendar.YEAR), now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH)) } null }

Akcje wykonywane w tej metodzie są dosyć proste. W przypadku gdy metoda zostanie wywołana z naszym kodem tworzymy DatePickerDialog z naszą implementacją OnDateSetListener. U mnie wygląda to następująco:

class DateListener(editText: EditText) extends DatePickerDialog.OnDateSetListener { override def onDateSet(view: DatePicker, year: Int, monthOfYear: Int, dayOfMonth: Int): Unit = { editText.setText(year + "-" + monthOfYear + "-" + dayOfMonth) } }

Wydaję mi się, ze kod jest na tyle prosty oraz intuicyjny, iż nie będę bardziej szczegółowo opisywał tych funkcji oraz klasy

Idź do oryginalnego materiału