Comment créer un sélecteur de date et d'heure sous Android? [fermé]

128

Existe-t-il un widget Android qui permet de choisir la date et l'heure en même temps? J'utilise déjà le sélecteur de temps de base et le sélecteur de date .

Mais ils ne sont pas si sexy et conviviaux (j'ai trouvé). Savez-vous s'il existe un widget comprenant à la fois la date et l'heure?

Merci beaucoup, Luc

Luc
la source

Réponses:

52

Il n'y a rien intégré à Android qui offre cela.

EDIT: Andriod propose désormais des sélecteurs intégrés. Vérifiez la réponse @Oded

CommonsWare
la source
2
Je sais que cette réponse date de plus d'un an, mais je pense que cette réponse devrait être mise à jour. La bibliothèque DateSlider référencée par Rabi tout en bas semble être parfaite pour cela.
Stephan Branczyk
Je suis d'accord que cette réponse devrait être mise à jour car c'est un widget génial. Cependant, le code pointé par Rabi est déjà un peu obsolète et contient des méthodes obsolètes, par exemple showDialog. Peut-être que quelque chose de plus actuel arrivera bientôt.
Eugene van der Merwe
13
En fait, la réponse est correcte et ne doit pas être mise à jour. Même si AndroidDateSlider existe, il n'y a rien de intégré à Android qui offre cette fonctionnalité.
Cristian
4
Suis-je le seul déconcerté par le fait que Google ne prend même pas en charge l'un des contrôles les plus largement utilisés dans toutes les applications d'entreprise?
l46kok
76

Mettez les deux DatePickeretTimePicker dans un format 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>

Le 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
la source
2
Excellent exemple, merci. Un point ... vous voulez probablement avoir alertDialog.dismiss (); à la fin de l'implémentation onClick.
Jonathan
Impossible de choisir l'année dans cet exemple.
lostintranslation
Juste un problème ... lors de l'utilisation dans Android L, le sélecteur de date et d'heure ne rentre pas sur l'écran ... donc je mets le linearLayout dans un scrollView ... Maintenant, le problème est que lorsque j'essaie de changer l'heure, la mise en page défile à cause du scrollView..Any solution to this
Dominic D'Souza
s'il vous plaît aider, il ne rentre pas en mode paysage, comment le réparer
Awadesh
1
Android 6.0+ cette mise en page a l'air moche; ( static.pychat.org/photo/f1qRFo31_Screenshot_20170214-123713.png
deathangel908
64

Utilisez cette fonction, elle vous permettra de photographier la date et l'heure une par une, puis de la définir sur la date variable globale. Pas de bibliothèque pas de 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
la source
L'un des moyens les plus simples
Vicky Thakor
3
L'appel nécessite le niveau d'API 24.
RRaj
27

DatePicker et TimePicker combinés dans DialogFragment pour Android

J'ai créé une bibliothèque pour ce faire. Il a également des couleurs personnalisables!

C'est très simple à utiliser.

Commencez par créer un auditeur:

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

Ensuite, vous créez et affichez la boîte de dialogue:

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

J'espère que tu trouves cela utile.

JDJ
la source
vraiment bon! sauvé mon temps! Merci ! Cependant, j'ai dû cloner le code, car je pense que la chaîne de dépendance Gradle n'est pas valide?
kuldeep
@ k2ibegin la page git du projet dit d'importer le module entier ou de "cloner le code", c'est le point, il n'a publié son impressionnant sélecteur de date-heure dans aucun dépôt. JDJ gentil homme de travail, super lib.
Ninja Coding
@JDJ désolé, mais je n'ai pas pu ajouter votre bibliothèque à mon projet, pouvez-vous m'expliquer comment?
Sebastian Delgado
3
Étape 1 téléchargez l'ensemble du projet en cliquant sur «Cloner ou télécharger» puis sur «télécharger ZIP» Étape 2 extraire le contenu zip, ou simplement le dossier ZIP \ SlideDateTimePicker-master \ slideDateTimePicker et copier ce dossier dans le conteneur de votre dossier racine de votre projet existant où vous souhaitez ajouter le plugin. Étape 3 ajoutez la dépendance via Gradle avec le projet de compilation (': slideDateTimePicker') OU avec Android Studio: Fichier> Nouveau> Importer le projet et sélectionnez le dossier extrait et configurez l'importation du projet normalement accepter et ensuite et terminer.
Codage Ninja
2
@JDJ nous avons un bogue, sur Lollipop ou Marshmallow, le DatePicker et TimePicker natifs ne sont pas affichés, mais montrent les composants pré-lollipop.
Ninja Coding
20

Appelez la boîte de dialogue du sélecteur de temps dans la DatePickerméthode de mise à jour de l'heure. Il ne sera pas appelé en même temps, mais lorsque vous appuyez DatePickersur le bouton de réglage. La boîte de dialogue du sélecteur de temps s'ouvre. La méthode est donnée ci-dessous.

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

le main.xml est donné ci-dessous

<?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
la source
14

Je voulais aussi combiner un DatePicker et un TimePicker. Je crée donc une API pour gérer les deux dans une seule interface! :)

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

entrez la description de l'image ici

Vous pouvez également utiliser SublimePicker

J-Jamet
la source
Très belle solution élégante. Fonctionne très bien. Quelques petits détails que j'ai rencontrés. 1) Le libellé AM / PM devenait tronqué, j'ai donc dû définir une taille de police plus petite dans le style:<item name="android:textSize">11sp</item> et supprimer le paramètre gras. 2) ressemble à setDefaultDateTime(..)doit être appelé ou vous obtenez une exception d'exécution .. donc j'appelle cela avec juste Calendar.getInstance().getTime()comme paramètre. Meilleur projet github pour un sélecteur de date que j'ai vu jusqu'à présent - merci de le partager
Gene Bo
13

Les URL que vous liez pour montrer comment faire apparaître une boîte de dialogue avec un sélecteur d'heure et une autre boîte de dialogue avec un sélecteur de date. Cependant, vous devez savoir que vous pouvez utiliser ces widgets d'interface utilisateur directement dans votre propre mise en page. Vous pouvez créer votre propre boîte de dialogue qui inclut à la fois un TimePicker et un DatePicker dans la même vue, réalisant ainsi ce que je pense que vous recherchez.

En d'autres termes, au lieu d'utiliser TimePickerDialog et DatePickerDialog, utilisez simplement les widgets d'interface utilisateur TimePicker et DatePicker directement dans votre propre boîte de dialogue ou activité.

Marque B
la source
1
Je suis d'accord que la solution de @Jaydeep Khamar n'est pas ce qui est demandé, ceux-ci ouvrent deux dialogues séparés. Il serait préférable de voir un exemple de code de base où cela est déjà combiné.
Eugene van der Merwe
9

J'étais confronté au même problème dans l'un de mes projets et j'ai décidé de créer un widget personnalisé contenant à la fois le sélecteur de date et d'heure dans une boîte de dialogue conviviale. Vous pouvez obtenir le code source avec un exemple à l' adresse http://code.google.com/p/datetimepicker/ . Le code est sous licence Apache 2.0.

ptashek
la source
5

Vous pouvez utiliser l'un des DatePicker library wdullaer / MaterialDateTimePicker

  • Premier spectacle 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:");
    }
  • ensuite 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);
    }
  • À l' onTimeSet callbackheure du magasin

     @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
la source
2

Une autre option est la roue Android projet qui se rapproche assez de la boîte de dialogue UIDatePicker d'iOS.

Il fournit un curseur vertical pour choisir n'importe quoi (y compris la date et l'heure). Si vous préférez le curseur horizontal, le DateSlider référencé par Rabi est meilleur.

pellucide
la source
Lien rompu. Voici une fourchette de roue androïde .
jk7
2

J'ai écrit un petit widget qui vous permet de choisir à la fois la date et l'heure.

DateTimeWidget

entrez la description de l'image ici

Kristy Welsh
la source
1

J'ai créé une boîte de dialogue d'alerte qui combine le sélecteur de date et le sélecteur d'heure. Vous pouvez obtenir du code sur https://github.com/nguyentoantuit/android Remarque: DateTimePicker est une bibliothèque

Toan Nguyen
la source
1
Notez que les réponses liées uniquement aux liens sont déconseillées, les réponses SO devraient être le point final de la recherche d'une solution (par rapport à une autre escale de références, qui ont tendance à devenir obsolètes avec le temps). Veuillez envisager d'ajouter un synopsis autonome ici, en gardant le lien comme référence.
kleopatra
1

Voici une version plus compacte de l'idée de Jaydeep de montrer un dialogue après l'autre. J'aime cette solution car elle n'a pas de dépendances.

        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
la source