Як створити інструмент вибору дати та часу в Android? [зачинено]


128

Чи є якийсь андроїд-віджет, який дозволяє одночасно вибрати дату та час? Я вже використовую основний інструмент вибору часу та вибору дати .

Але вони не такі сексуальні та зручні для користувачів (я знайшов). Чи знаєте ви, чи існує віджет із датою та часом?

Велике спасибі, Люк

Відповіді:


52

В Android нічого не вбудовано.

EDIT: Андріод тепер пропонує вбудовані вибирачі. Перевірте відповідь @Oded


2
Я знаю, що цій відповіді більше року, але я думаю, що цю відповідь слід оновити. Бібліотека DateSlider, на яку посилається Рабі внизу, ідеально підходить для цього.
Стефан Бранчик

Я згоден, цю відповідь слід оновити, оскільки це приголомшливий віджет. Однак код, на який вказує Рабі, вже трохи застарів і містить деякі застарілі методи, наприклад showDialog. Можливо, незабаром відбудеться щось більш актуальне.
Євген ван дер Мерве

13
Насправді відповідь правильна і її не слід оновлювати. Навіть якщо AndroidDateSlider існує, в Android немає нічого, що пропонує цю функцію.
Крістіан

4
Я єдиний здивований тим, що Google навіть не підтримує один із найпоширеніших елементів управління в будь-яких бізнес-додатках?
l46kok

76

Покладіть обидва DatePickerі TimePickerв макет 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>

Код:

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();

2
Блискучий приклад, дякую. Один момент ... ви, ймовірно, хочете мати alertDialog.dismiss (); наприкінці реалізації onClick.
Джонатан

Неможливо вибрати рік у цьому прикладі.
втраченопереклад

Лише одна проблема ... при використанні в android L вибір дат і часу не поміщаються на екрані ... тому я ставлю linearLayout в scrollView ... Тепер проблема полягає в тому, що коли я намагаюся змінити час, макет прокручується через scrollView..Усяке рішення для цього
Домінік

будь ласка, допоможіть, він не вписується в ландшафтний режим, як це виправити
Awadesh

1
На Android 6.0+ цей макет виглядає некрасиво; ( static.pychat.org/photo/f1qRFo31_Screenshot_20170214-123713.png
deathangel908

64

Використовуючи цю функцію, вона дозволить вам вибирати дату та час по черзі, а потім встановлювати її на глобальну змінну дату. Ні бібліотеки, ні 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();
}

Один з найпростіших способів
Вікі Такор

3
Для дзвінка потрібен API рівня 24
RRaj

27

об'єднано DatePicker та TimePicker у DialogFragment для Android

Я створив бібліотеку для цього. Він також має настроювані кольори!

Це дуже просто у використанні.

Спочатку ви створите слухача:

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

Потім ви створюєте та показуєте діалогове вікно:

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

Сподіваюсь, вам це стане в нагоді.


дійсно хороший! врятував мій час! Дякую ! Однак мені довелося клонувати код, тому що я думаю, що рядок залежності gradle недійсний?
kuldeep

@ k2ibegin git-сторінка проекту каже, що імпортувати весь модуль або "клонувати код", ось суть, він не публікував свого дивовижного вибору дати-часу в жодному сховищі. JDJ приємна людина, чудова робота.
Кодування Ninja

@JDJ Вибачте, але мені не вдалося додати вашу бібліотеку до мого проекту, ви могли б пояснити як?
Себастьян Дельгадо

3
Крок 1 завантажте весь проект, натиснувши «Клонувати або завантажувати», а потім «завантажувати ZIP». Крок 2 витягуйте вміст zip або просто папку ZIP \ SlideDateTimePicker-master \ slideDateTimePicker і скопіюйте цю папку в контейнер кореневої папки вашого існуючого проекту, де ви хочете додати плагін. Крок 3 додайте залежність через Gradle з проектом компіляції (': slideDateTimePicker') АБО за допомогою Android Studio: Файл> Створити> Імпортувати проект та виберіть вилучену папку та налаштувати імпорт проекту, як правило, прийняти та наступний і завершити.
Кодування Ninja

2
@JDJ у нас є помилка, на Lollipop або Marshmallow рідні DatePicker і TimePicker не відображаються, натомість показує компоненти, що попередньо льодяник.
Кодування Ninja

20

Викличте діалогове вікно вибору DatePickerчасу в методі оновлення часу. Він не буде викликаний одночасно, але при натисканні DatePickerкнопки встановлення. Відкриється діалогове вікно вибору часу. Метод наведений нижче.

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 наведено нижче

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

14

Я також хотів поєднати DatePicker і TimePicker. Тому я створюю API для обробки обох в одному інтерфейсі! :)

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

введіть тут опис зображення

Ви також можете використовувати SublimePicker


Дуже приємне елегантне рішення. Чудово працює. Кілька дрібних деталей, на які я натрапив .. 1) Етикетка AM / PM стала врізаною, тому мені довелося встановити менший розмір шрифту в стилі: <item name="android:textSize">11sp</item> і видалити жирне налаштування. 2) схоже, що setDefaultDateTime(..)потрібно викликати або ви отримаєте виняток із виконання часу .. тому я називаю це так само, Calendar.getInstance().getTime()як параметр. Найкращий проект github для вибору побачень, який я бачив до цього часу - дякую, що поділився ним
Джин Бо

13

URL-адреси, які ви посилаєте, показують, як спливати діалогове вікно з вибору часу та інше діалогове вікно з вибором дати. Однак вам потрібно пам’ятати, що ви можете використовувати ці віджети інтерфейсу безпосередньо у власному макеті. Ви можете створити свій власний діалог, що включає в себе і TimePicker, і DatePicker в одному і тому ж представленні, таким чином виконуючи те, що я думаю, що ви шукаєте.

Іншими словами, замість використання TimePickerDialog та DatePickerDialog, просто використовуйте віджети інтерфейсу TimePicker та DatePicker безпосередньо у своєму діалоговому вікні чи діяльності.


1
Я погоджуюся, що рішення @Jaydeep Khamar - це не те, що просять, вони відкривають два окремих діалогу. Краще було б побачити базовий зразок коду, де це вже поєднано.
Євген ван дер Мерве

9

Я зіткнувся з тією самою проблемою в одному зі своїх проектів і вирішив зробити власний віджет, який містить і дату, і час вибору часу, в одному зручному для користувача діалозі. Ви можете отримати вихідний код разом із прикладом на веб-сайті http://code.google.com/p/datetimepicker/ . Код ліцензований під Apache 2.0.



5

Ви можете використовувати один з DatePicker library wdullaer / MaterialDateTimePicker

  • Перше шоу 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:");
    }
  • Тоді 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);
    }
  • На onTimeSet callbackчас зберігання

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


2

Ще один варіант - це проект на колесах Android, який досить близько закриє діалогове вікно UIDatePicker iOS.

Він забезпечує вертикальний повзунок, щоб вибрати що завгодно (включаючи дату та час). Якщо ви віддаєте перевагу горизонтальному повзунку, кращим є DateSlider, на який посилається Рабі.


Перервана посилання. Ось вилка андроїд-колеса .
jk7


1

Я створив діалогове вікно попередження, яке поєднує інструмент вибору дати та вибору часу. Ви можете отримати код на https://github.com/nguyentoantuit/android Примітка: DateTimePicker - це бібліотека


1
Зауважте, що відповіді, що стосуються лише посилань, не відштовхують, відповіді на відповідність повинні бути кінцевою точкою пошуку рішення (проти ще однієї зупинки посилань, яка, як правило, затягується з часом). Просимо додати тут окремий конспект, зберігаючи посилання як орієнтир.
Клеопатра

1

Ось більш компактна версія ідеї Jaydeep про те, щоб показати один діалог за іншим. Мені подобається це рішення, оскільки воно не має залежностей.

        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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.