web-dev-qa-db-fra.com

Sélecteur DateTime dans Android application

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

Mais ils ne sont pas si sexy et convivial (j'ai trouvé). Savez-vous s'il existe un widget incluant la date et l'heure? Merci beaucoup, Luc

118
Luc

Android n'offre pas cette fonctionnalité.

EDIT: Android propose désormais des sélecteurs intégrés. Vérifier @ Oded answer

51
CommonsWare

Placez à la fois DatePicker et TimePicker dans un XML de présentation.

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();
64
Oded Breiner

Utilisez cette fonction, elle vous permettra d’indiquer la date et l’heure une par une, puis de la définir comme date de 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();
}
47
Abhishek

combined DatePicker and TimePicker in DialogFragment for Android

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

C'est très simple à utiliser.

D'abord, vous créez 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.

25
JDJ

Appelez la boîte de dialogue du sélecteur de temps dans la méthode DatePicker time time. Il ne sera pas appelé en même temps mais quand vous appuierez sur le bouton DatePicker set. 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 fichier principal.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>
20
Jaydeep Khamar

Les URL que vous liez pour montrer comment ouvrir une boîte de dialogue avec un sélecteur de temps 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 présentation. Vous pouvez créer votre propre boîte de dialogue incluant à la fois un TimePicker et un DatePicker, 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 dialogue ou activité.

13
Mark B

Je voulais aussi combiner un DatePicker et un TimePicker. Je crée donc une API pour gérer les deux à la fois! :)

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

enter image description here

Vous pouvez également utiliser SublimePicker

12
J-Jamet

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é comportant à la fois un 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.

9
ptashek

J'ai créé, mis à jour, refactored et mavenized le projet Android-dateslider. C'est sur Github maintenant:

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

6
Cristian
4
nghien_rbc

Vous pouvez utiliser l'un des DatePicker librarywdullaer/MaterialDateTimePicker

  • Première émission 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);
    }
    
  • Sur onTimeSet callback temps de 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);
    }
    
3
Khaled Lela

Une autre option est le projet Android-wheel qui se rapproche beaucoup de la boîte de dialogue UIDatePicker d’iOS.

Il fournit un curseur vertical pour sélectionner 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.

2
pellucide

J'ai créé un dialogue d'alerte qui combine le sélecteur de date et le sélecteur de temps. Vous pouvez obtenir le code sur https://github.com/nguyentoantuit/Android Remarque: DateTimePicker est une bibliothèque.

1
Toan Nguyen

Voici une version plus compacte de l'idée de Jaydeep d'afficher une boîte de 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();
1
Roger Keays

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

DateTimeWidget

enter image description here

1
Kristy Welsh