¿Cómo crear un selector de fecha y hora en Android? [cerrado]

128

¿Hay algún widget de Android que permita elegir la fecha y la hora al mismo tiempo? Ya uso el selector de tiempo básico y el selector de fecha .

Pero no son tan sexys y fáciles de usar (encontré). ¿Sabes si existe un widget que incluya tanto la fecha como la hora?

Muchas gracias Luc

Luc
fuente

Respuestas:

52

No hay nada integrado en Android que ofrezca esto.

EDITAR: Andriod ahora ofrece recolectores integrados. Marque la respuesta @Oded

CommonsWare
fuente
2
Sé que esta respuesta tiene más de un año, pero creo que esta respuesta debería actualizarse. La biblioteca DateSlider referenciada por Rabi hasta el final parece ser perfecta para esto.
Stephan Branczyk
Estoy de acuerdo en que esta respuesta debe actualizarse porque es un widget increíble. Sin embargo, el código señalado por Rabi ya está un poco desactualizado y contiene algunos métodos obsoletos, por ejemplo showDialog. Tal vez algo más actual vendrá pronto.
Eugene van der Merwe
13
En realidad, la respuesta es correcta y no debe actualizarse. Incluso si existe AndroidDateSlider, no hay nada integrado en Android que ofrezca esa función.
Cristian
44
¿Soy el único desconcertado por el hecho de que Google ni siquiera admite uno de los controles más utilizados en las aplicaciones comerciales?
l46kok
76

Poner ambos DatePickery TimePickeren un diseño 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>

El código:

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
fuente
2
Brillante ejemplo, gracias. Un punto ... probablemente desee tener alertDialog.dismiss (); al final de la implementación de onClick.
Jonathan
No se puede elegir el año en este ejemplo.
lostintranslation
Solo un problema ... cuando uso en Android L, el selector de fecha y hora no cabe en la pantalla ... así que coloco el diseño lineal en una vista de desplazamiento ... Ahora el problema es que cuando trato de cambiar la hora, el diseño se desplaza debido a scrollView ... Cualquier solución a esto
Dominic D'Souza
por favor ayuda, no encaja en modo horizontal, cómo solucionarlo
Awadesh
1
Android 6.0+ este diseño se ve feo; ( static.pychat.org/photo/f1qRFo31_Screenshot_20170214-123713.png
deathangel908
64

Utilice esta función, le permitirá hacer una foto de la fecha y la hora una por una y luego configurarla como fecha variable global. Sin biblioteca no 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
fuente
Una de las formas más simples
Vicky Thakor
3
La llamada requiere API nivel 24.
RRaj
27

DatePicker y TimePicker combinados en DialogFragment para Android

Creé una biblioteca para hacer esto. ¡También tiene colores personalizables!

Es muy simple de usar.

Primero creas un oyente:

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

Luego crea y muestra el diálogo:

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

Espero que le sea útil.

JDJ
fuente
realmente bueno! me salvó el tiempo! Gracias ! Sin embargo, tuve que clonar el código, porque creo que la cadena de dependencia de Gradle no es válida.
kuldeep
@ k2ibegin, la página git del proyecto dice que se debe importar todo el módulo o "clonar el código", ese es el punto, no publicó su asombroso selector de fecha y hora en ningún repositorio. JDJ buen hombre de trabajo, gran lib.
Ninja Coding
@JDJ lo siento, pero no he podido agregar su biblioteca a mi proyecto, ¿podría explicar cómo?
Sebastian Delgado
3
Paso 1 descargue todo el proyecto haciendo clic en "Clonar o descargar" y luego "descargar ZIP" Paso 2 extraiga el contenido zip, o simplemente la carpeta ZIP \ SlideDateTimePicker-master \ slideDateTimePicker y copie esa carpeta al contenedor de la carpeta raíz de su proyecto existente donde desea agregar el complemento. Paso 3 agregue la dependencia a través de Gradle con el proyecto de compilación (': slideDateTimePicker') O con Android Studio: Archivo> Nuevo> Importar proyecto y seleccione la carpeta extraída y configure la importación del proyecto normalmente acepte y luego y finalice.
Ninja Coding
2
@JDJ tenemos un error, en Lollipop o Marshmallow, el DatePicker nativo y el TimePicker no se muestran, sino que muestran los componentes de pre-lollipop.
Ninja Coding
20

Llame al cuadro de diálogo del selector de tiempo en el DatePickermétodo de tiempo de actualización. No se llamará al mismo tiempo, pero cuando presione el DatePickerbotón de configuración. Se abrirá el cuadro de diálogo del selector de hora. El método se da a continuación.

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

el main.xml se da a continuación

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

También quería combinar un DatePicker y un TimePicker. ¡Así que creo una API para manejar ambos en una interfaz! :)

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

ingrese la descripción de la imagen aquí

También puedes usar SublimePicker

J-Jamet
fuente
Muy buena solución elegante. Funciona genial. Me encontré con algunos pequeños detalles. 1) La etiqueta AM / PM se estaba truncando, así que tuve que establecer un tamaño de fuente más pequeño con estilo: <item name="android:textSize">11sp</item> y eliminar la configuración en negrita. 2) parece que setDefaultDateTime(..)debe llamarse o se obtiene una excepción de tiempo de ejecución ... así que lo llamo solo Calendar.getInstance().getTime()como parámetro. El mejor proyecto de github para un selector de fechas que he visto hasta ahora - gracias por compartirlo
Gene Bo
13

Las URL que vincula para mostrar cómo abrir un cuadro de diálogo con un selector de hora y otro cuadro de diálogo con un selector de fecha. Sin embargo, debe tener en cuenta que puede usar esos widgets de UI directamente en su propio diseño. Puede crear su propio cuadro de diálogo que incluya TimePicker y DatePicker en la misma vista, logrando así lo que creo que está buscando.

En otras palabras, en lugar de usar TimePickerDialog y DatePickerDialog, simplemente use los widgets de UI TimePicker y DatePicker directamente en su propio diálogo o actividad.

Mark B
fuente
1
Estoy de acuerdo en que la solución de @Jaydeep Khamar no es lo que se pide, sino que están abriendo dos diálogos separados. Sería mejor ver código de muestra básico donde esto ya está combinado.
Eugene van der Merwe
9

Estaba enfrentando el mismo problema en uno de mis proyectos y he decidido hacer un widget personalizado que tenga tanto la fecha como el selector de hora en un diálogo fácil de usar. Puede obtener el código fuente junto con un ejemplo en http://code.google.com/p/datetimepicker/ . El código está licenciado bajo Apache 2.0.

ptashek
fuente
5

Puede usar uno de DatePicker library wdullaer / MaterialDateTimePicker

  • Primero muestra 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:");
    }
  • Luego 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);
    }
  • En onTimeSet callbacktiempo de tienda

     @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
fuente
2

Otra opción es la rueda de Android proyecto de la que se acerca bastante al cuadro de diálogo UIDatePicker de iOS.

Proporciona un control deslizante vertical para elegir cualquier cosa (incluida la fecha y la hora). Si prefiere el control deslizante horizontal, el DateSlider al que hace referencia Rabi es mejor.

pelucida
fuente
Enlace roto. Aquí hay un tenedor de la rueda de Android .
jk7
2

Escribí un pequeño widget que te permite elegir la fecha y la hora.

DateTimeWidget

ingrese la descripción de la imagen aquí

Kristy Welsh
fuente
1

He creado un diálogo de alerta que combina el selector de fecha y el selector de hora. Puede obtener el código en https://github.com/nguyentoantuit/android Nota: DateTimePicker es una biblioteca

Toan Nguyen
fuente
1
Tenga en cuenta que se desaconsejan las respuestas de solo enlace , las respuestas SO deben ser el punto final de una búsqueda de una solución (frente a otra escala de referencias, que tienden a quedarse obsoletas con el tiempo). Considere agregar una sinopsis independiente aquí, manteniendo el enlace como referencia.
kleopatra
1

Aquí hay una versión más compacta de la idea de Jaydeep de mostrar un diálogo tras otro. Me gusta esta solución porque no tiene dependencias.

        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
fuente