Jak utworzyć selektor daty i godziny w systemie Android? [Zamknięte]

128

Czy istnieje widget na Androida, który umożliwia jednoczesne wybranie daty i godziny? Używam już podstawowego selektora czasu i daty .

Ale nie są tak seksowne i przyjazne dla użytkownika (znalazłem). Czy wiesz, czy istnieje widżet zawierający zarówno datę, jak i godzinę?

Wielkie dzięki, Luc

Luc
źródło

Odpowiedzi:

52

W Androidzie nie ma nic, co to oferuje.

EDYCJA: Andriod oferuje teraz wbudowane zbieracze. Sprawdź odpowiedź @Oded

CommonsWare
źródło
2
Wiem, że ta odpowiedź ma ponad rok, ale myślę, że należy ją zaktualizować. Biblioteka DateSlider, do której odwołuje się Rabi poniżej, wydaje się być do tego idealna.
Stephan Branczyk
Zgadzam się, że ta odpowiedź powinna zostać zaktualizowana, ponieważ to niesamowity widżet. Jednak kod wskazany przez Rabi jest już nieco przestarzały i zawiera kilka przestarzałych metod, np showDialog. Być może wkrótce pojawi się coś bardziej aktualnego.
Eugene van der Merwe
13
Właściwie odpowiedź jest prawidłowa i nie należy jej aktualizować. Nawet jeśli istnieje AndroidDateSlider, w systemie Android nie ma nic, co oferuje tę funkcję.
Cristian
4
Czy tylko ja jestem zdumiony faktem, że Google nie obsługuje nawet jednego z najczęściej używanych elementów sterujących w żadnych aplikacjach biznesowych?
l46kok
76

Umieścić zarówno DatePickeroraz TimePickerw XML układu.

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>

Kod:

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
źródło
2
Świetny przykład, dzięki. Jedna uwaga ... prawdopodobnie chcesz mieć alertDialog.dismiss (); na końcu implementacji onClick.
Jonathan,
W tym przykładzie nie można wybrać roku.
Lostintranslation
Tylko jeden problem ... podczas używania w systemie Android L selektor daty i czasu nie mieści się na ekranie ... więc umieszczam linearLayout w scrollView ... Teraz problem polega na tym, że kiedy próbuję zmienić czas przewijania układu ze względu na scrollView .. Każde rozwiązanie tego problemu
Dominic D'Souza,
proszę o pomoc, nie pasuje do trybu poziomego, jak to naprawić
Awadesh
1
Android 6.0+ ten układ wygląda brzydko; ( static.pychat.org/photo/f1qRFo31_Screenshot_20170214-123713.png
deathangel908
64

Skorzystaj z tej funkcji, która pozwoli Ci zobrazić datę i godzinę jeden po drugim, a następnie ustawić globalną zmienną datę. Brak biblioteki bez 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
źródło
Jeden z najprostszych sposobów
Vicky Thakor
3
Wywołanie wymaga poziomu API 24.
RRaj
27

połączone DatePicker i TimePicker w DialogFragment dla systemu Android

Stworzyłem bibliotekę, aby to zrobić. Ma również konfigurowalne kolory!

Jest bardzo prosty w użyciu.

Najpierw tworzysz odbiornik:

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

Następnie utwórz i pokaż okno dialogowe:

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

Mam nadzieję, że uznasz to za przydatne.

JDJ
źródło
naprawdę dobry! oszczędził mi czas! dzięki ! Jednak musiałem sklonować kod, ponieważ myślę, że ciąg zależności gradle jest nieprawidłowy?
kuldeep
@ k2ibegin strona git projektu mówi, aby zaimportować cały moduł lub „sklonować kod”, o to chodzi, nie opublikował swojego niesamowitego selektora daty i czasu w żadnym repozytorium. JDJ niezła robota, świetna lib.
Ninja Coding,
@JDJ przepraszam, ale nie udało mi się dodać Twojej biblioteki do mojego projektu, czy możesz wyjaśnić, jak to zrobić?
Sebastian Delgado,
3
Krok 1 pobierz cały projekt, klikając „Klonuj lub pobierz”, a następnie „pobierz ZIP”. Krok 2 wyodrębnij zawartość zip lub tylko folder ZIP \ SlideDateTimePicker-master \ slideDateTimePicker i skopiuj ten folder do kontenera głównego folderu istniejącego projektu, gdzie chcesz dodać wtyczkę. Krok 3 dodaj Zależność przez Gradle z kompilacją projektu (': slideDateTimePicker') LUB z Android Studio: Plik> Nowy> Importuj projekt i wybierz rozpakowany folder i skonfiguruj import projektu normalnie zaakceptuj, a następnie i zakończ.
Ninja Coding
2
@JDJ mamy błąd, na Lollipop lub Marshmallow natywny DatePicker i TimePicker nie jest wyświetlany, zamiast tego pokazuje komponenty pre-Lollipop.
Ninja Coding
20

Wywołaj okno dialogowe wyboru DatePickerczasu w metodzie aktualizacji czasu. Nie zostanie wywołany w tym samym czasie, ale po naciśnięciu DatePickerprzycisku ustawiania. Otworzy się okno dialogowe wyboru czasu. Metoda jest podana poniżej.

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

plik main.xml znajduje się poniżej

<?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
źródło
14

Chciałem też połączyć DatePicker i TimePicker. Więc tworzę API do obsługi obu w jednym interfejsie! :)

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

wprowadź opis obrazu tutaj

Możesz także użyć SublimePicker

J-Jamet
źródło
Bardzo ładne, eleganckie rozwiązanie. Działa świetnie. Kilka drobnych szczegółów, na które natknąłem się .. 1) Etykieta AM / PM była ucinana, więc musiałem ustawić mniejszy rozmiar czcionki w stylu: <item name="android:textSize">11sp</item> i usunąć ustawienie pogrubienia. 2) wygląda na to, że setDefaultDateTime(..)musi zostać wywołany lub otrzymujesz wyjątek czasu wykonania ... więc nazywam to tak samo, Calendar.getInstance().getTime()jak parametr. Najlepszy projekt na githubie dla selektora dat, jaki widziałem do tej pory - dzięki za udostępnienie go
Gene Bo
13

Adresy URL, które łączysz, aby pokazać, jak wyświetlić okno dialogowe z selektorem czasu i inne okno dialogowe z selektorem dat. Musisz jednak mieć świadomość, że możesz używać tych widżetów interfejsu użytkownika bezpośrednio we własnym układzie. Możesz zbudować własne okno dialogowe, które zawiera zarówno TimePicker, jak i DatePicker w tym samym widoku, osiągając w ten sposób to, czego myślę, że szukasz.

Innymi słowy, zamiast używać TimePickerDialog i DatePickerDialog, po prostu użyj widżetów interfejsu użytkownika TimePicker i DatePicker bezpośrednio w swoim własnym oknie dialogowym lub działaniu.

Mark B.
źródło
1
Zgadzam się, że rozwiązanie @Jaydeep Khamar nie jest tym, o co proszono, otwierają dwa oddzielne okna dialogowe. Lepiej byłoby zobaczyć podstawowy przykładowy kod, który jest już połączony.
Eugene van der Merwe
9

Miałem ten sam problem w jednym z moich projektów i zdecydowałem się stworzyć niestandardowy widget, który będzie zawierał zarówno selektor daty, jak i czasu w jednym przyjaznym dla użytkownika oknie dialogowym. Możesz pobrać kod źródłowy wraz z przykładem pod adresem http://code.google.com/p/datetimepicker/ . Kod jest licencjonowany w ramach Apache 2.0.

ptashek
źródło
5

Możesz użyć jednego z DatePicker library wdullaer / MaterialDateTimePicker

  • Najpierw pokaż 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:");
    }
  • Następnie 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 callbackczas przechowywania

     @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
źródło
2

Inną opcją jest koło androida , który jest dość blisko okna dialogowego UIDatePicker systemu iOS.

Zapewnia pionowy suwak do wybierania czegokolwiek (w tym daty i godziny). Jeśli wolisz poziomy suwak, lepszy jest DateSlider, do którego odwołuje się Rabi.

przezroczysty
źródło
Uszkodzony link. Oto widelec koła androida .
jk7
2

Napisałem mały widget, który pozwala wybrać zarówno datę, jak i godzinę.

DateTimeWidget

wprowadź opis obrazu tutaj

Kristy Welsh
źródło
1

Utworzyłem okno dialogowe ostrzeżenia, które łączy selektor dat i selektor czasu. Możesz pobrać kod na https://github.com/nguyentoantuit/android Uwaga: DateTimePicker to biblioteka

Toan Nguyen
źródło
1
Zwróć uwagę, że odradza się udzielanie odpowiedzi zawierających tylko łącze , odpowiedzi SO powinny być końcowym punktem poszukiwania rozwiązania (w porównaniu z kolejnym zatrzymaniem odniesień, które z czasem stają się nieaktualne). Proszę rozważyć dodanie tutaj samodzielnego streszczenia, zachowując link jako odniesienie.
kleopatra 12.12.13
1

Oto bardziej zwięzła wersja pomysłu Jaydeepa, polegającego na pokazywaniu jednego okna dialogowego po drugim. Podoba mi się to rozwiązanie, ponieważ nie ma żadnych zależności.

        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
źródło