Wie erstelle ich eine Datums- und Zeitauswahl in Android? [geschlossen]

128

Gibt es ein Android-Widget, mit dem Datum und Uhrzeit gleichzeitig ausgewählt werden können? Ich benutze bereits die grundlegende Zeit- und Datumsauswahl .

Aber sie sind nicht so sexy und benutzerfreundlich (fand ich). Wissen Sie, ob ein Widget mit Datum und Uhrzeit vorhanden ist?

Vielen Dank, Luc

Luc
quelle

Antworten:

52

In Android ist nichts eingebaut, was dies bietet.

EDIT: Andriod bietet jetzt eingebaute Picker an. Überprüfen Sie die Antwort von @Oded

CommonsWare
quelle
2
Ich weiß, dass diese Antwort mehr als ein Jahr alt ist, aber ich denke, diese Antwort sollte aktualisiert werden. Die DateSlider-Bibliothek, auf die Rabi unten verweist, scheint dafür perfekt zu sein.
Stephan Branczyk
Ich bin damit einverstanden, dass diese Antwort aktualisiert wird, da dies ein fantastisches Widget ist. Der Code, auf den Rabi hinweist, ist jedoch bereits etwas veraltet und enthält einige veraltete Methoden, z showDialog. Vielleicht kommt bald etwas Aktuelleres.
Eugene van der Merwe
13
Eigentlich ist die Antwort richtig und sollte nicht aktualisiert werden. Selbst wenn AndroidDateSlider vorhanden ist, ist in Android nichts integriert, das diese Funktion bietet.
Cristian
4
Bin ich der einzige, der verblüfft darüber ist, dass Google nicht einmal eines der am häufigsten verwendeten Steuerelemente in Geschäftsanwendungen unterstützt?
l46kok
76

Fügen Sie beide DatePickerund TimePickerin ein Layout-XML ein.

date_time_picker.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:padding="8dp"
    android:layout_height="match_parent">

    <DatePicker
        android:id="@+id/date_picker"
        android:layout_width="match_parent"
        android:calendarViewShown="true"
        android:spinnersShown="false"
        android:layout_weight="4"
        android:layout_height="0dp" />

    <TimePicker
        android:id="@+id/time_picker"
        android:layout_weight="4"
        android:layout_width="match_parent"
        android:layout_height="0dp" />

    <Button
        android:id="@+id/date_time_set"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:text="Set"
        android:layout_height="0dp" />

</LinearLayout>

Der Code:

final View dialogView = View.inflate(activity, R.layout.date_time_picker, null);
final AlertDialog alertDialog = new AlertDialog.Builder(activity).create();

dialogView.findViewById(R.id.date_time_set).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

         DatePicker datePicker = (DatePicker) dialogView.findViewById(R.id.date_picker);
         TimePicker timePicker = (TimePicker) dialogView.findViewById(R.id.time_picker);

         Calendar calendar = new GregorianCalendar(datePicker.getYear(),
                            datePicker.getMonth(),
                            datePicker.getDayOfMonth(),
                            timePicker.getCurrentHour(),
                            timePicker.getCurrentMinute());

         time = calendar.getTimeInMillis();
         alertDialog.dismiss();
    }});
alertDialog.setView(dialogView);
alertDialog.show();
Oded Breiner
quelle
2
Geniales Beispiel, danke. Ein Punkt ... Sie möchten wahrscheinlich alertDialog.dismiss () haben; am Ende der onClick-Implementierung.
Jonathan
In diesem Beispiel kann kein Jahr ausgewählt werden.
Übersetzung
Nur ein Problem ... bei der Verwendung in Android L passt die Datums- und Uhrzeitauswahl nicht auf den Bildschirm. Also habe ich das lineare Layout in eine Bildlaufansicht eingefügt ... Das Problem ist nun, dass ich versuche, die Uhrzeit zu ändern, wenn das Layout gescrollt wird wegen der scrollView..Jede Lösung dafür
Dominic D'Souza
Bitte helfen Sie, es passt nicht in den Querformat-Modus, wie man es repariert
Awadesh
1
Android 6.0+ dieses Layout sieht hässlich aus; ( static.pychat.org/photo/f1qRFo31_Screenshot_20170214-123713.png
Deathangel908
64

Mit dieser Funktion können Sie Datum und Uhrzeit nacheinander erfassen und dann auf das Datum der globalen Variablen einstellen. Keine Bibliothek, kein XML.

Calendar date;
public void showDateTimePicker() {
   final Calendar currentDate = Calendar.getInstance();
   date = Calendar.getInstance();
   new DatePickerDialog(context, new DatePickerDialog.OnDateSetListener() {
       @Override
       public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            date.set(year, monthOfYear, dayOfMonth);
            new TimePickerDialog(context, new TimePickerDialog.OnTimeSetListener() {
                @Override
                public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                    date.set(Calendar.HOUR_OF_DAY, hourOfDay);
                    date.set(Calendar.MINUTE, minute);
                    Log.v(TAG, "The choosen one " + date.getTime());
                }
            }, currentDate.get(Calendar.HOUR_OF_DAY), currentDate.get(Calendar.MINUTE), false).show();
       }
   }, currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH), currentDate.get(Calendar.DATE)).show();
}
Abhishek
quelle
Einer der einfachsten Wege
Vicky Thakor
3
Anruf erfordert API-Level 24.
RRaj
27

kombinierter DatePicker und TimePicker in DialogFragment für Android

Ich habe dazu eine Bibliothek erstellt . Es hat auch anpassbare Farben!

Es ist sehr einfach zu bedienen.

Zuerst erstellen Sie einen Listener:

private SlideDateTimeListener listener = new SlideDateTimeListener() {

    @Override
    public void onDateTimeSet(Date date)
    {
        // Do something with the date. This Date object contains
        // the date and time that the user has selected.
    }

    @Override
    public void onDateTimeCancel()
    {
        // Overriding onDateTimeCancel() is optional.
    }
};

Dann erstellen Sie den Dialog und zeigen ihn an:

new SlideDateTimePicker.Builder(getSupportFragmentManager())
    .setListener(listener)
    .setInitialDate(new Date())
    .build()
    .show();

Ich hoffe, Sie finden es nützlich.

JDJ
quelle
wirklich gut! hat mir Zeit gespart! Vielen Dank ! Allerdings musste ich den Code klonen, weil ich denke, Gradle-Abhängigkeitszeichenfolge ist nicht gültig?
Kuldeep
@ k2ibegin Auf der Git-Seite des Projekts heißt es, das gesamte Modul zu importieren oder "den Code zu klonen". Das ist der Punkt, er hat seine großartige Datums- und Uhrzeitauswahl in keinem Repository veröffentlicht. JDJ netter Arbeiter, tolle Bibliothek.
Ninja Coding
@JDJ Entschuldigung, aber ich konnte Ihre Bibliothek nicht zu meinem Projekt hinzufügen. Können Sie erklären, wie?
Sebastian Delgado
3
Schritt 1 Download das gesamte Projekt durch Klicken auf „Clone oder Download“ und „Download ZIP“ dann Schritt 2 Extrakt zip Inhalt, oder einfach nur die ZIP \ SlideDateTimePicker-Master \ slideDateTimePicker Ordner und kopieren Sie diesen Ordner zu Ihrem Stammordner Container Ihres bestehenden Projekt , bei dem Sie möchten das Plugin hinzufügen. Schritt 3 Fügen Sie die Abhängigkeit über Gradle mit dem Kompilierungsprojekt (': slideDateTimePicker') ODER mit Android Studio hinzu: Datei> Neu> Projekt importieren und wählen Sie den extrahierten Ordner aus und konfigurieren Sie den Projektimport.
Ninja Coding
2
@JDJ Wir haben einen Fehler, auf Lollipop oder Marshmallow wird der native DatePicker und TimePicker nicht angezeigt, sondern die Pre-Lollipop-Komponenten.
Ninja Coding
20

Rufen Sie den Zeitauswahldialog in der DatePickerAktualisierungszeitmethode auf. Es wird nicht gleichzeitig aufgerufen, sondern wenn Sie die DatePickerSet-Taste drücken. Der Zeitauswahldialog wird geöffnet. Die Methode ist unten angegeben.

package com.android.date;

import java.util.Calendar;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;
import android.widget.TimePicker;

public class datepicker extends Activity {

    private TextView mDateDisplay;
    private Button mPickDate;
    private int mYear;
    private int mMonth;
    private int mDay;
    private TextView mTimeDisplay;
    private Button mPickTime;

    private int mhour;
    private int mminute;

    static final int TIME_DIALOG_ID = 1;

    static final int DATE_DIALOG_ID = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mDateDisplay =(TextView)findViewById(R.id.date);
        mPickDate =(Button)findViewById(R.id.datepicker);
        mTimeDisplay = (TextView) findViewById(R.id.time);
        mPickTime = (Button) findViewById(R.id.timepicker);

        //Pick time's click event listener
        mPickTime.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                showDialog(TIME_DIALOG_ID);
            }
        });

        //PickDate's click event listener 
        mPickDate.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                showDialog(DATE_DIALOG_ID);
            }
        });

        final Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);
        mhour = c.get(Calendar.HOUR_OF_DAY);
        mminute = c.get(Calendar.MINUTE);
    }

    //-------------------------------------------update date---//    
    private void updateDate() {
        mDateDisplay.setText(
            new StringBuilder()
                    // Month is 0 based so add 1
                    .append(mDay).append("/")
                    .append(mMonth + 1).append("/")
                    .append(mYear).append(" "));
        showDialog(TIME_DIALOG_ID);
    }

      //-------------------------------------------update time---//    
    public void updatetime() {
        mTimeDisplay.setText(
                new StringBuilder()
                        .append(pad(mhour)).append(":")
                        .append(pad(mminute))); 
    }

    private static String pad(int c) {
        if (c >= 10)
            return String.valueOf(c);
        else
            return "0" + String.valueOf(c);


    //Datepicker dialog generation  

    private DatePickerDialog.OnDateSetListener mDateSetListener =
        new DatePickerDialog.OnDateSetListener() {

            public void onDateSet(DatePicker view, int year, 
                                  int monthOfYear, int dayOfMonth) {
                mYear = year;
                mMonth = monthOfYear;
                mDay = dayOfMonth;
                updateDate();
            }
        };


     // Timepicker dialog generation
        private TimePickerDialog.OnTimeSetListener mTimeSetListener =
            new TimePickerDialog.OnTimeSetListener() {
                public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                    mhour = hourOfDay;
                    mminute = minute;
                    updatetime();
                }
            };

        @Override
        protected Dialog onCreateDialog(int id) {
            switch (id) {
            case DATE_DIALOG_ID:
                return new DatePickerDialog(this,
                            mDateSetListener,
                            mYear, mMonth, mDay);

            case TIME_DIALOG_ID:
                return new TimePickerDialog(this,
                        mTimeSetListener, mhour, mminute, false);

            }
            return null;
        }
}

Die Datei main.xml ist unten angegeben

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello"/>

    <TextView android:id="@+id/time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""/>

    <Button
        android:id="@+id/timepicker"
        android:text="Change Time" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content"/>

    <TextView 
        android:id="@+id/date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""/>

    <Button android:id="@+id/datepicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="200dp"
        android:text="Change the date"/>

</LinearLayout>
Jaydeep Khamar
quelle
14

Ich wollte auch einen DatePicker und einen TimePicker kombinieren. Also erstelle ich eine API, um beide in einer Schnittstelle zu handhaben! :) :)

https://github.com/Kunzisoft/Android-SwitchDateTimePicker

Geben Sie hier die Bildbeschreibung ein

Sie können auch SublimePicker verwenden

J-Jamet
quelle
Sehr schöne elegante Lösung. Funktioniert super. Ein paar kleine Details, auf die ich gestoßen bin. 1) Das AM / PM-Etikett wurde abgeschnitten, daher musste ich eine kleinere Schriftgröße im Stil festlegen: <item name="android:textSize">11sp</item> und die fettgedruckte Einstellung entfernen. 2) sieht so setDefaultDateTime(..)aus, als müsste aufgerufen werden oder man bekommt eine Laufzeitausnahme .. also nenne ich das nur Calendar.getInstance().getTime()mit dem Parameter. Bestes Github-Projekt für einen Date Picker, den ich bisher gesehen habe - danke fürs Teilen
Gene Bo
13

Die URLs, die Sie verknüpfen, um zu zeigen, wie ein Dialogfeld mit einer Zeitauswahl und ein anderes Dialogfeld mit einer Datumsauswahl geöffnet werden. Sie müssen sich jedoch bewusst sein, dass Sie diese UI-Widgets direkt in Ihrem eigenen Layout verwenden können. Sie können einen eigenen Dialog erstellen, der sowohl einen TimePicker als auch einen DatePicker in derselben Ansicht enthält, und so das erreichen, wonach Sie suchen.

Mit anderen Worten, anstatt TimePickerDialog und DatePickerDialog zu verwenden, verwenden Sie einfach die UI-Widgets TimePicker und DatePicker direkt in Ihrem eigenen Dialog oder Ihrer eigenen Aktivität.

Mark B.
quelle
1
Ich bin damit einverstanden, dass die Lösung von @Jaydeep Khamar nicht das ist, wonach gefragt wird. Diese öffnen zwei separate Dialoge. Es ist besser, grundlegenden Beispielcode zu sehen, in dem dieser bereits kombiniert ist.
Eugene van der Merwe
9

Ich hatte in einem meiner Projekte das gleiche Problem und habe beschlossen, ein benutzerdefiniertes Widget zu erstellen, das sowohl die Datums- als auch die Zeitauswahl in einem benutzerfreundlichen Dialogfeld enthält. Sie können den Quellcode zusammen mit einem Beispiel unter http://code.google.com/p/datetimepicker/ abrufen . Der Code ist unter Apache 2.0 lizenziert.

ptashek
quelle
6

Ich habe das Android-Dateslider-Projekt gegabelt, aktualisiert, überarbeitet und mavenisiert. Es ist jetzt auf Github:

https://github.com/casidiablo/date-slider

Cristian
quelle
2
Haben Sie ein Beispiel, wie man das benutzt?
Roger Keays
5

Sie können einen von DatePicker library wdullaer / MaterialDateTimePicker verwenden

  • Zeigen Sie zuerst DatePicker.

    private void showDatePicker() {
    Calendar now = Calendar.getInstance();
    DatePickerDialog dpd = DatePickerDialog.newInstance(
            HomeActivity.this,
            now.get(Calendar.YEAR),
            now.get(Calendar.MONTH),
            now.get(Calendar.DAY_OF_MONTH)
    );
    dpd.show(getFragmentManager(), "Choose Date:");
    }
  • Dann onDateSet callback store date & show TimePicker

    @Override
    public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, monthOfYear, dayOfMonth);
    filter.setDate(cal.getTime());
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            showTimePicker();
        }
    },500);
    }
  • Auf onTimeSet callbackSpeicherzeit

     @Override
     public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute) {
    Calendar cal = Calendar.getInstance();
    if(filter.getDate()!=null)
        cal.setTime(filter.getDate());
    cal.set(Calendar.HOUR_OF_DAY,hourOfDay);
    cal.set(Calendar.MINUTE,minute);
    }
Khaled Lela
quelle
2

Eine weitere Option ist das Android-Rad Projekt, das dem UIDatePicker-Dialog von iOS ziemlich nahe kommt.

Es bietet einen vertikalen Schieberegler, mit dem Sie alles auswählen können (einschließlich Datum und Uhrzeit). Wenn Sie einen horizontalen Schieberegler bevorzugen, ist der von Rabi referenzierte DateSlider besser.

Pellucid
quelle
Defekter Link. Hier ist eine Gabel aus Android-Rad .
jk7
2

Ich habe ein kleines Widget geschrieben, mit dem Sie Datum und Uhrzeit auswählen können.

DateTimeWidget

Geben Sie hier die Bildbeschreibung ein

Kristy Welsh
quelle
1

Ich habe einen Warndialog erstellt, der Datumsauswahl und Zeitauswahl kombiniert. Sie können Code unter https://github.com/nguyentoantuit/android erhalten. Hinweis: DateTimePicker ist eine Bibliothek

Toan Nguyen
quelle
1
Beachten Sie, dass von Antworten nur auf Links abgeraten wird. SO-Antworten sollten der Endpunkt einer Suche nach einer Lösung sein (im Gegensatz zu einem weiteren Zwischenstopp von Referenzen, die im Laufe der Zeit veralten). Bitte fügen Sie hier eine eigenständige Zusammenfassung hinzu, wobei Sie den Link als Referenz behalten.
Kleopatra
1

Hier ist eine kompaktere Version von Jaydeeps Idee, einen Dialog nach dem anderen anzuzeigen. Ich mag diese Lösung, weil sie keine Abhängigkeiten hat.

        Date value = new Date();
        final Calendar cal = Calendar.getInstance();
        cal.setTime(value);
        new DatePickerDialog(this,
            new DatePickerDialog.OnDateSetListener() {
                @Override public void onDateSet(DatePicker view, 
                        int y, int m, int d) {
                    cal.set(Calendar.YEAR, y);
                    cal.set(Calendar.MONTH, m);
                    cal.set(Calendar.DAY_OF_MONTH, d);

                    // now show the time picker
                    new TimePickerDialog(NoteEditor.this,
                        new TimePickerDialog.OnTimeSetListener() {
                            @Override public void onTimeSet(TimePicker view, 
                                    int h, int min) {
                                cal.set(Calendar.HOUR_OF_DAY, h);
                                cal.set(Calendar.MINUTE, min);
                                value = cal.getTime();
                            }
                        }, cal.get(Calendar.HOUR_OF_DAY), 
                            cal.get(Calendar.MINUTE), true).show();
                 }
            }, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
            cal.get(Calendar.DAY_OF_MONTH)).show();
Roger Keays
quelle