Android-Programmierung: Datumseingabe
Willemers Informatik-Ecke

DatePicker

Man kann in das Layout einen DatePicker einfügen. Dieser wird von der Palette nicht angeboten. Also zieht man eine TextView in das Display und ändert den Typ von TextView auf DatePicker.

Wie der DatePicker aussieht hängt von zwei Attributen ab.

Das Auslesen des DatePickers von Java aus:
DatePicker datePicker = (DatePicker) findViewById(R.id.datePicker);
int day = datePicker.getDayOfMonth();
int month = datePicker.getMonth() + 1;
int year = datePicker.getYear();
Der DatePicker ist von seinen Ausmaßen leider ein wenig fett. Da hilft vielleicht die folgende Alternative.

Eingabefeld mit Popup-Kalender

In der Palette des Layout-Designers befindet sich unter Text auch ein Date. Das benötigt natürlich weniger Platz. Allerdings ist die Eingabe nicht sehr intuitiv. Man kann aber auf den Klick auf dieses Feld einen Date-Picker starten.
  1. Das Date aus der Palette wird auf das Display gezogen.
  2. Das Attribut focusable wird auf false gestellt. Damit ist eine direkte Eingabe nicht mehr möglich.
  3. Unter hint kann man einen Hinweis darauf geben, dass hier ein Datum erfasst wird, also etwa "Datum erfassen".

Starten des Kalenders bei Berührung des Eingabefelds

Das Ganze nun im Listing.
public class MainActivity extends AppCompatActivity
        implements DatePickerDialog.OnDateSetListener {
    private Calendar calendar = Calendar.getInstance();
    private EditText edDate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        edDate = findViewById(R.id.editTextDate);
        updateDate();
        edDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new DatePickerDialog(MainActivity.this, MainActivity.this,
                        calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                        calendar.get(Calendar.DAY_OF_MONTH)).show();
            }
        });
    }

    // Benötigt Zugriff auf calendar und edDate
    private void updateDate() {
        String myFormat = "yyyy-MM-dd";
        SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.getDefault());
        edDate.setText(sdf.format(calendar.getTime()));
    }

    @Override
    public void onDateSet(DatePicker datePicker, int year, int month, int dayOfMonth) {
            calendar.set(Calendar.YEAR, year);
            calendar.set(Calendar.MONTH, month);
            calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
            updateDate();
    }
}

Links