Come creare un selettore di data e ora in Android? [chiuso]


128

Esistono widget Android che consentono di selezionare contemporaneamente la data e l'ora? Uso già il selettore orario e il selettore data di base .

Ma non sono così sexy e facili da usare (ho trovato). Sai se esiste un widget che include sia la data che l'ora?

Grazie mille, Luc

Risposte:


52

Non c'è nulla di integrato in Android che offre questo.

EDIT: Andriod ora offre picker integrati. Controlla la risposta @Oded


2
So che questa risposta ha più di un anno, ma penso che questa risposta debba essere aggiornata. La libreria DateSlider a cui fa riferimento Rabi fino in fondo sembra essere perfetta per questo.
Stephan Branczyk,

Sono d'accordo che questa risposta dovrebbe essere aggiornata perché è un widget fantastico. Tuttavia, il codice indicato da Rabi è già un po 'obsoleto e contiene alcuni metodi obsoleti, ad es showDialog. Forse qualcosa di più attuale arriverà presto.
Eugene van der Merwe,

13
In realtà la risposta è corretta e non dovrebbe essere aggiornata. Anche se esiste AndroidDateSlider, in Android non esiste nulla che offra tale funzionalità.
Cristian,

4
Sono l'unico sconcertato dal fatto che Google non supporti nemmeno uno dei controlli più utilizzati in tutte le applicazioni aziendali in circolazione?
l46kok

76

Inserisci entrambi DatePickere TimePickerin un layout XML.

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>

Il codice:

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();

2
Esempio brillante, grazie. Un punto ... probabilmente vorrai avere alertDialog.dismiss (); alla fine dell'implementazione di onClick.
Jonathan,

Non posso scegliere l'anno in questo esempio.
lostintranslation

Solo un problema ... quando si utilizza in Android L il selettore di data e ora non si adatta allo schermo ... quindi ho messo il layout lineare in uno scrollView ... Ora il problema è che quando provo a cambiare il tempo scorre il layout a causa dello scrollView ... Qualunque soluzione a questo
Dominic D'Souza,

per favore aiuto, non è adatto alla modalità orizzontale, come risolverlo
Awadesh


64

Utilizzare questa funzione ti consentirà di visualizzare la data e l'ora una per una, quindi impostarla sulla data della variabile globale. Nessuna libreria senza 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();
}

Uno dei modi più semplici
Vicky Thakor,

3
La chiamata richiede il livello API 24.
RRaj

27

combinati DatePicker e TimePicker in DialogFragment per Android

Ho creato una libreria per farlo. Ha anche colori personalizzabili!

È molto semplice da usare.

Per prima cosa crei un ascoltatore:

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.
    }
};

Quindi si crea e mostra la finestra di dialogo:

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

Spero che lo trovi utile.


davvero buono! mi ha salvato il tempo! Grazie ! Tuttavia, ho dovuto clonare il codice, perché penso che la stringa di dipendenza gradle non sia valida?
Kuldeep,

@ k2ibegin la pagina git del progetto dice di importare l'intero modulo o "clonare il codice", questo è il punto, non ha pubblicato il suo fantastico selettore di data e ora in nessun repository. JDJ bel lavoro uomo, grande lib.
Ninja Coding

@JDJ scusa, ma non sono stato in grado di aggiungere la tua libreria al mio progetto, potresti spiegare come?
Sebastian Delgado,

3
Passaggio 1: scaricare l'intero progetto facendo clic su "Clona o scarica" ​​e quindi "download ZIP" Passaggio 2: estrarre il contenuto zip o semplicemente la cartella ZIP \ SlideDateTimePicker-master \ slideDateTimePicker e copiarla nella cartella principale del progetto esistente dove vuoi aggiungere il plugin. Passaggio 3: aggiungere la dipendenza tramite Gradle con il progetto di compilazione (': slideDateTimePicker') OPPURE con Android Studio: File> Nuovo> Importa progetto e selezionare la cartella estratta e configurare l'importazione del progetto normalmente accettata e successiva e fine.
Ninja Coding

2
@JDJ abbiamo un bug, su Lollipop o Marshmallow il DatePicker nativo e TimePicker non sono mostrati, invece mostra i componenti pre-lollipop.
Ninja Coding

20

Chiamare la finestra di dialogo Selettore tempo nel DatePickermetodo dell'ora di aggiornamento. Non verrà chiamato contemporaneamente ma quando si preme il DatePickerpulsante set. Si aprirà la finestra di dialogo di selezione del tempo. Il metodo è indicato di seguito.

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;
        }
}

il file main.xml è riportato di seguito

<?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>

14

Volevo anche combinare un DatePicker e un TimePicker. Quindi creo un'API per gestirli entrambi in un'unica interfaccia! :)

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

inserisci qui la descrizione dell'immagine

Puoi anche usare SublimePicker


Soluzione elegante molto bella. Funziona alla grande. Alcuni piccoli dettagli in cui mi sono imbattuto .. 1) L'etichetta AM / PM veniva troncata, quindi ho dovuto impostare una dimensione del carattere più piccola in stile: <item name="android:textSize">11sp</item> e rimuovere l'impostazione in grassetto. 2) sembra che setDefaultDateTime(..)debba essere chiamato o si ottiene un'eccezione di runtime .. quindi lo chiamo proprio Calendar.getInstance().getTime()come parametro. Il miglior progetto github per un selezionatore di date che ho visto finora - grazie per averlo condiviso
Gene Bo,

13

Gli URL collegati per mostrare come visualizzare una finestra di dialogo con un selettore dell'ora e un'altra finestra di dialogo con un selettore della data. Tuttavia, è necessario essere consapevoli del fatto che è possibile utilizzare tali widget dell'interfaccia utente direttamente nel proprio layout. Potresti creare la tua finestra di dialogo che include sia TimePicker che DatePicker nella stessa vista, realizzando così ciò che penso tu stia cercando.

In altre parole, invece di utilizzare TimePickerDialog e DatePickerDialog, basta usare i widget UI TimePicker e DatePicker direttamente nella propria finestra di dialogo o attività.


1
Sono d'accordo che la soluzione di @Jaydeep Khamar non è ciò che viene richiesto, quelli stanno aprendo due dialoghi separati. Sarebbe meglio vedere il codice di esempio di base dove questo è già combinato.
Eugene van der Merwe,

9

Stavo affrontando lo stesso problema in uno dei miei progetti e ho deciso di creare un widget personalizzato con la selezione della data e dell'ora in una finestra di dialogo intuitiva. Puoi ottenere il codice sorgente insieme a un esempio su http://code.google.com/p/datetimepicker/ . Il codice è concesso in licenza in Apache 2.0.



5

Puoi usare uno di DatePicker library wdullaer / MaterialDateTimePicker

  • Primo spettacolo 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:");
    }
  • Poi 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);
    }
  • In onTimeSet callbackorario di negozio

     @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);
    }


2

Un'altra opzione è la ruota Android progetto che si avvicina molto alla finestra di dialogo UIDatePicker di iOS.

Fornisce un dispositivo di scorrimento verticale per selezionare qualsiasi cosa (inclusi data e ora). Se preferisci il cursore orizzontale, il DateSlider a cui fa riferimento Rabi è migliore.


Collegamento non funzionante. Ecco un fork di Android-Wheel .
jk7,


1

Ho creato una finestra di avviso che combina Selettore data e Selettore ora. Puoi ottenere il codice su https://github.com/nguyentoantuit/android Nota: DateTimePicker è una libreria


1
Si noti che le risposte solo al collegamento sono sconsigliate, le risposte SO dovrebbero essere il punto finale di una ricerca di una soluzione (rispetto a un altro scalo di riferimento, che tende a diventare stantio nel tempo). Si prega di considerare l'aggiunta di una sinossi stand-alone qui, mantenendo il collegamento come riferimento.
Kleopatra,

1

Ecco una versione più compatta dell'idea di Jaydeep di mostrare un dialogo dopo l'altro. Mi piace questa soluzione perché non ha dipendenze.

        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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.