146 votes

Comment créer un sélecteur de date et d'heure dans Android ?

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

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

Merci beaucoup, Luc

1 votes

Il existe une bibliothèque Github pour le sélecteur de date et d'heure : AndroidDateTimePicker .

90voto

Oded Breiner Points 1852

Mettez les deux DatePicker y TimePicker dans une mise en page 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();

2 votes

Brillant exemple, merci. Un point... vous voulez probablement avoir alertDialog.dismiss() ; à la fin de l'implémentation onClick.

0 votes

On ne peut pas choisir l'année dans cet exemple.

0 votes

Juste un problème... lorsque j'utilise Android L, le sélecteur de date et d'heure ne tient pas sur l'écran... j'ai donc placé le linearLayout dans un scrollView... Maintenant, le problème est que lorsque j'essaie de changer l'heure, le layout défile à cause du scrollView... Une solution à cela ?

54voto

CommonsWare Points 402670

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

EDIT : Andriod offre maintenant des sélecteurs intégrés. Consultez Réponse de @Oded

2 votes

Je sais que cette réponse date de plus d'un an, mais je pense qu'elle devrait être mise à jour. La bibliothèque DateSlider référencée par Rabi tout en bas semble être parfaite pour cela.

0 votes

Je suis d'accord pour que cette réponse soit mise à jour car c'est un widget génial. Cependant, le code pointé par Rabi est déjà un peu dépassé et contient des méthodes obsolètes, par ex. showDialog . Peut-être que quelque chose de plus actuel verra le jour bientôt.

14 votes

La réponse actuelle est correcte et ne devrait pas être mise à jour. Même si AndroidDateSlider existe, il n'y a rien d'intégré dans Android qui offre cette fonctionnalité.

21voto

Jaydeep Khamar Points 3806

Appelez la boîte de dialogue de sélection de l'heure dans le DatePicker méthode de temps de mise à jour. Elle ne sera pas appelée au même moment mais lorsque vous appuyez sur DatePicker bouton de réglage. La boîte de dialogue de sélection de l'heure 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>

13voto

mbaird Points 31293

Les URL que vous indiquez montrent 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, ce qui vous permettra d'obtenir ce que vous recherchez, je pense.

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

1 votes

Je suis d'accord que la solution de @Jaydeep Khamar n'est pas ce qui est demandé, ce sont deux dialogues séparés qui s'ouvrent. Il serait préférable de voir un exemple de code de base où cela est déjà combiné.

9voto

ptashek Points 101

J'ai été confronté au même problème dans l'un de mes projets et j'ai décidé de créer un widget personnalisé qui permet de choisir à la fois la date et l'heure dans un dialogue convivial. Vous pouvez obtenir le code source ainsi qu'un exemple à l'adresse suivante http://code.google.com/p/datetimepicker/ . Le code est sous licence Apache 2.0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X