Como criar um selecionador de data e hora no Android? [fechadas]

128

Existe algum widget do Android que permita escolher a data e a hora ao mesmo tempo? Eu já uso o seletor de horário básico e o seletor de datas .

Mas eles não são tão sexy e amigáveis ​​(eu achei). Você sabe se existe um widget incluindo data e hora?

Muito obrigado, Luc

Luc
fonte

Respostas:

52

Não há nada embutido no Android que ofereça isso.

Edição: Andriod agora oferece selecionadores embutidos. Verifique a resposta @Oded

CommonsWare
fonte
2
Sei que esta resposta tem mais de um ano, mas acho que essa resposta deve ser atualizada. A biblioteca DateSlider mencionada por Rabi até o fim parece perfeita para isso.
Stephan Branczyk
Concordo que esta resposta deve ser atualizada porque é um widget incrível. No entanto, o código apontado por Rabi já está um pouco desatualizado e contém alguns métodos obsoletos, por exemplo showDialog. Talvez algo mais atual venha em breve.
Eugene van der Merwe
13
Na verdade, a resposta está correta e não deve ser atualizada. Mesmo que o AndroidDateSlider exista, não há nada incorporado ao Android que ofereça esse recurso.
Cristian
4
Eu sou o único desconcertado com o fato de o Google nem sequer suportar um dos controles mais amplamente usados ​​em qualquer aplicativo de negócios por aí?
L46kok
76

Coloque ambos DatePickere TimePickerem um 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>

O 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
fonte
2
Exemplo brilhante, obrigado. Um ponto ... você provavelmente quer ter alertDialog.dismiss (); no final da implementação do onClick.
Jonathan
Não é possível escolher o ano neste exemplo.
Lostintranslation
Apenas um problema ... ao usar no Android L, o seletor de data e hora não cabe na tela ... então eu coloco o linearLayout em um scrollView ... Agora, o problema é que, quando tento alterar a hora, o layout rola porque da solução scrollView..Any a esta
Dominic D'Souza
Por favor, ajudem, não se encaixam no modo paisagem, como corrigi-lo
Awadesh
1
Android 6.0+ este layout olha feio; ( static.pychat.org/photo/f1qRFo31_Screenshot_20170214-123713.png
deathangel908
64

Use esta função para permitir que você defina a data e a hora uma a uma e depois defina-a para a data variável global. Nenhuma biblioteca sem 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
fonte
Uma das maneiras mais simples
Vicky Thakor
3
A chamada requer o nível 24 da API.
RRaj 22/12/19
27

DatePicker e TimePicker combinados no DialogFragment para Android

Eu criei uma biblioteca para fazer isso. Ele também tem cores personalizáveis!

É muito simples de usar.

Primeiro você cria um ouvinte:

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

Então você cria e mostra a caixa de diálogo:

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

Espero que você ache útil.

JDJ
fonte
realmente bom! economizei meu tempo! obrigado ! No entanto, eu tive que clonar o código, porque acho que a cadeia de dependência de gradle não é válida?
precisa saber é o seguinte
@ k2ibegin na página git do projeto diz para importar o módulo inteiro ou "clonar o código", esse é o ponto, ele não publicou seu incrível seletor de data e hora em nenhum repositório. JDJ bom trabalho, ótimo lib.
Ninja Coding
@JDJ desculpe, mas não consegui adicionar sua biblioteca ao meu projeto, você poderia explicar como?
Sebastian Delgado
3
Etapa 1 Baixe o projeto inteiro clicando em "Clonar ou baixar" e depois "baixar ZIP". Etapa 2 extraia o conteúdo zip ou apenas a pasta ZIP \ SlideDateTimePicker-master \ slideDateTimePicker e copie essa pasta para o contêiner da pasta raiz do projeto existente, onde você deseja adicionar o plugin. Etapa 3 adicione a Dependência via Gradle com o projeto de compilação (': slideDateTimePicker') OU com o Android Studio: Arquivo> Novo> Importar Projeto e selecione a pasta extraída e configure a importação do projeto normalmente aceita e próxima e finalize a importação do projeto.
Ninja Coding
2
@JDJ, temos um bug: no Lollipop ou no Marshmallow, o DatePicker nativo e o TimePicker não são mostrados, mas sim os componentes pré-pirulito.
Ninja Coding
20

Chame a caixa de diálogo do seletor de horas no DatePickermétodo de hora da atualização. Não será chamado ao mesmo tempo, mas quando você pressionar o DatePickerbotão set. A caixa de diálogo do seletor de horas será aberta. O método é dado abaixo.

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

o main.xml é fornecido abaixo

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

Eu também queria combinar um DatePicker e um TimePicker. Então, eu crio uma API para lidar com ambos em uma interface! :)

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

insira a descrição da imagem aqui

Você também pode usar o SublimePicker

J-Jamet
fonte
Solução elegante muito agradável. Funciona bem. Encontrei alguns pequenos detalhes. 1) O rótulo AM / PM estava ficando truncado, então tive que definir um tamanho de fonte menor com estilo: <item name="android:textSize">11sp</item> e remover a configuração em negrito. 2) parece que setDefaultDateTime(..)deve ser chamado ou você recebe uma exceção de tempo de execução .. então eu chamo isso com apenas Calendar.getInstance().getTime()como parâmetro. Melhor projeto github para um selecionador de data que eu tenho visto até agora - obrigado por compartilhar isso
Gene Bo
13

Os URLs que você vincula para mostrar como abrir uma caixa de diálogo com um seletor de horas e outra caixa de diálogo com um seletor de datas. No entanto, você precisa estar ciente de que pode usar esses widgets da interface do usuário diretamente em seu próprio layout. Você pode criar sua própria caixa de diálogo que inclui um TimePicker e DatePicker na mesma exibição, realizando o que eu acho que você está procurando.

Em outras palavras, em vez de usar TimePickerDialog e DatePickerDialog, basta usar os widgets da interface do usuário TimePicker e DatePicker diretamente em sua própria caixa de diálogo ou atividade.

Mark B
fonte
1
Concordo que a solução de @Jaydeep Khamar não é o que é solicitado, eles estão abrindo dois diálogos separados. Seria melhor ver o código de exemplo básico onde isso já está combinado.
Eugene van der Merwe
9

Eu estava enfrentando o mesmo problema em um dos meus projetos e decidi criar um widget personalizado que possui o selecionador de data e hora em um diálogo fácil de usar. Você pode obter o código-fonte junto com um exemplo em http://code.google.com/p/datetimepicker/ . O código está licenciado sob Apache 2.0.

ptashek
fonte
5

Você pode usar um dos DatePicker library wdullaer / MaterialDateTimePicker

  • Primeiro show 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:");
    }
    
  • Então 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);
    }
    
  • Na onTimeSet callbackhora da loja

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

Outra opção é o projeto android-wheel , que chega bem perto da caixa de diálogo UIDatePicker do iOS.

Ele fornece um controle deslizante vertical para escolher qualquer coisa (incluindo data e hora). Se você preferir o controle deslizante horizontal, o DateSlider mencionado por Rabi é melhor.

pelucida
fonte
Link quebrado. Aqui está um garfo de roda android .
Jk7
2

Eu escrevi um pequeno widget que permite escolher data e hora.

DateTimeWidget

insira a descrição da imagem aqui

Kristy Welsh
fonte
1

Criei uma caixa de diálogo de alerta que combina o selecionador de data e o selecionador de hora. Você pode obter o código em https://github.com/nguyentoantuit/android Nota: DateTimePicker é uma biblioteca

Toan Nguyen
fonte
1
Observe que as respostas somente para links são desencorajadas; as respostas SO devem ser o ponto final de uma pesquisa por uma solução (em comparação com outra parada de referências, que tendem a ficar obsoletas ao longo do tempo). Considere adicionar aqui uma sinopse independente, mantendo o link como referência.
precisa
1

Aqui está uma versão mais compacta da idéia de Jaydeep de mostrar um diálogo após o outro. Eu gosto desta solução porque não tem dependências.

        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
fonte