Bagaimana cara membuat pemilih tanggal dan waktu di Android? [Tutup]

128

Apakah ada widget android yang memungkinkan untuk memilih tanggal dan waktu pada saat yang bersamaan? Saya sudah menggunakan pemilih waktu dasar dan pemilih tanggal .

Tapi mereka tidak seksi dan ramah pengguna (saya temukan). Apakah Anda tahu jika ada widget termasuk tanggal dan waktu?

Terima kasih banyak, Luc

Luc
sumber

Jawaban:

52

Tidak ada yang dibangun pada Android yang menawarkan ini.

EDIT: Andriod sekarang menawarkan pemetik bawaan. Periksa @Oded jawaban

CommonsWare
sumber
2
Saya tahu respons ini lebih dari setahun, tetapi saya pikir respons ini harus diperbarui. Pustaka DateSlider yang dirujuk oleh Rabi di bawah ini tampaknya sempurna untuk ini.
Stephan Branczyk
Saya setuju jawaban ini harus diperbarui karena itu adalah widget yang luar biasa. Namun kode yang ditunjukkan oleh Rabi sudah agak ketinggalan zaman dan berisi beberapa metode yang sudah usang misalnya showDialog. Mungkin sesuatu yang lebih baru akan segera hadir.
Eugene van der Merwe
13
Sebenarnya jawabannya benar dan tidak boleh diperbarui. Bahkan jika AndroidDateSlider ada, tidak ada yang dibangun pada Android yang menawarkan fitur itu.
Cristian
4
Apakah saya satu-satunya yang bingung dengan kenyataan bahwa Google bahkan tidak mendukung salah satu kontrol yang paling banyak digunakan dalam aplikasi bisnis apa pun di luar sana?
15kok
76

Masukkan keduanya DatePickerdan TimePickerdalam tata letak 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>

Kode:

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
sumber
2
Contoh cemerlang, terima kasih. Satu titik ... Anda mungkin ingin memiliki alertDialog.dismiss (); di akhir implementasi onClick.
Jonathan
Tidak dapat memilih tahun dalam contoh ini.
lostintranslation
Hanya satu masalah ... ketika menggunakan di android L pemilih tanggal dan waktu tidak cocok di layar..jadi saya meletakkan linearLayout di scrollView ... Sekarang masalahnya adalah ketika saya mencoba mengubah waktu tata letak gulungan karena scrollView..Setiap solusi untuk ini
Dominic D'Souza
tolong bantu, itu tidak cocok dalam mode lansekap, bagaimana cara memperbaikinya
Awadesh
1
Android 6.0+ tata letak ini terlihat jelek; ( static.pychat.org/photo/f1qRFo31_Screenshot_20170214-123713.png
deathangel908
64

Gunakan fungsi ini yang akan memungkinkan Anda untuk memotret tanggal dan waktu satu per satu kemudian mengaturnya ke tanggal variabel global. Tidak ada perpustakaan tanpa 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
sumber
Salah satu cara paling sederhana
Vicky Thakor
3
Panggilan membutuhkan API level 24.
RRaj
27

DatePicker dan TimePicker gabungan dalam DialogFragment untuk Android

Saya membuat perpustakaan untuk melakukan ini. Ini juga memiliki warna yang dapat disesuaikan!

Ini sangat mudah digunakan.

Pertama Anda membuat pendengar:

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

Kemudian Anda membuat dan menampilkan dialog:

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

Semoga bermanfaat.

JDJ
sumber
benar-benar bagus! menghemat waktu saya! terima kasih! Namun, saya harus mengkloning kode, karena saya pikir string dependensi gradle tidak valid?
kuldeep
@ k2ibegin halaman git dari proyek mengatakan untuk mengimpor seluruh modul atau "mengkloning kode", itu intinya, dia tidak menerbitkan pemetik tanggal-waktu yang mengagumkan di repositori mana pun. JDJ pekerja yang baik, Lib.
Ninja Coding
@JDJ maaf, tetapi saya belum dapat menambahkan perpustakaan Anda ke proyek saya, bisakah Anda menjelaskan caranya?
Sebastian Delgado
3
Langkah 1 unduh seluruh proyek dengan mengklik "Klon atau unduh" dan kemudian "unduh ZIP" Langkah 2 ekstrak konten zip, atau hanya folder ZIP \ SlideDateTimePicker-master \ slideDateTimePicker dan salin folder itu ke wadah folder root Anda dari proyek yang ada di mana Anda ingin menambahkan plugin. Langkah 3 tambahkan Dependency via Gradle dengan proyek kompilasi (': slideDateTimePicker') ATAU dengan Android Studio: File> New> Import Project dan pilih folder yang diekstraksi dan konfigurasikan impor proyek yang biasanya diterima dan selanjutnya dan selesai.
Ninja Coding
2
@JDJ kami memiliki bug, pada Lollipop atau Marshmallow, DatePicker dan TimePicker asli tidak ditampilkan, sebagai gantinya menunjukkan komponen pra-lollipop.
Ninja Coding
20

Panggil dialog pemilih waktu dalam DatePickermetode waktu pembaruan. Itu tidak akan dipanggil pada saat yang sama tetapi ketika Anda menekan DatePickertombol set. Dialog pemilih waktu akan terbuka. Metode diberikan di bawah ini.

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

main.xml diberikan di bawah ini

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

Saya juga ingin menggabungkan DatePicker dan TimePicker. Jadi saya membuat API untuk menangani keduanya dalam satu antarmuka! :)

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

masukkan deskripsi gambar di sini

Anda juga dapat menggunakan SublimePicker

J-Jamet
sumber
Solusi elegan yang sangat bagus. Bagus sekali. Beberapa detail kecil yang saya temui .. 1) Label AM / PM semakin terpotong, jadi saya harus mengatur ukuran font yang lebih kecil dalam gaya: <item name="android:textSize">11sp</item> dan menghapus pengaturan tebal. 2) sepertinya setDefaultDateTime(..)harus dipanggil atau Anda mendapatkan pengecualian runtime .. jadi saya menyebutnya dengan hanya Calendar.getInstance().getTime()sebagai parameter. Proyek github terbaik untuk pemilih tanggal yang telah saya lihat sejauh ini - terima kasih telah berbagi
Gene Bo
13

URL yang Anda tautkan untuk menunjukkan cara memunculkan dialog dengan pemilih waktu dan dialog lain dengan pemilih tanggal. Namun Anda harus sadar bahwa Anda dapat menggunakan widget UI itu secara langsung di tata letak Anda sendiri. Anda bisa membuat dialog sendiri yang menyertakan TimePicker dan DatePicker dalam tampilan yang sama, sehingga mencapai apa yang saya pikir Anda cari.

Dengan kata lain, alih-alih menggunakan TimePickerDialog dan DatePickerDialog, cukup gunakan widget UI TimePicker dan DatePicker secara langsung dalam dialog atau aktivitas Anda sendiri.

Markus B
sumber
1
Saya setuju bahwa solusi @Jaydeep Khamar bukan yang diminta, yaitu membuka dua dialog terpisah. Akan lebih baik untuk melihat kode sampel dasar di mana ini sudah digabungkan.
Eugene van der Merwe
9

Saya menghadapi masalah yang sama di salah satu proyek saya dan telah memutuskan untuk membuat widget khusus yang memiliki tanggal dan pemilih waktu dalam satu dialog ramah pengguna. Anda bisa mendapatkan kode sumber beserta contohnya di http://code.google.com/p/datetimepicker/ . Kode dilisensikan di bawah Apache 2.0.

ptashek
sumber
6

Saya bercabang, memperbarui, refactored dan meremehkan proyek Android-Datelider. Ada di Github sekarang:

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

Cristian
sumber
2
apakah Anda memiliki contoh tentang cara menggunakan ini?
Roger Keays
5

Anda dapat menggunakan salah satu dari DatePicker library wdullaer / MaterialDateTimePicker

  • Pertunjukan DatePicker pertama.

    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:");
    }
  • Kemudian 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);
    }
  • Di onTimeSet callback waktu toko

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

Pilihan lain adalah roda android proyek yang cukup dekat dengan dialog UIDatePicker iOS.

Ini menyediakan bilah geser vertikal untuk mengambil apa pun (termasuk tanggal dan waktu). Jika Anda lebih suka slider horisontal, DateSlider yang dirujuk oleh Rabi lebih baik.

pellucide
sumber
Tautan rusak. Ini adalah garpu roda android .
jk7
2

Saya menulis sedikit widget yang memungkinkan Anda memilih tanggal dan waktu.

DateTimeWidget

masukkan deskripsi gambar di sini

Kristy Welsh
sumber
1

Saya telah membuat dialog peringatan yang menggabungkan Pemilih tanggal dan Pemilih waktu. Anda bisa mendapatkan kode di https://github.com/nguyentoantuit/android Catatan: DateTimePicker adalah perpustakaan

Toan Nguyen
sumber
1
Perhatikan bahwa jawaban hanya tautan tidak disarankan, jawaban SO harus menjadi titik akhir dari pencarian solusi (vs. persinggahan referensi lainnya, yang cenderung menjadi basi seiring waktu). Harap pertimbangkan untuk menambahkan sinopsis mandiri di sini, dengan menjaga tautan sebagai referensi.
kleopatra
1

Ini adalah versi yang lebih ringkas dari ide Jaydeep untuk menunjukkan dialog satu per satu. Saya suka solusi ini karena tidak memiliki dependensi.

        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
sumber