Как создать сборщик даты и времени в Android? [закрыто]

128

Есть ли какой-нибудь виджет для Android, который позволяет одновременно выбирать дату и время? Я уже использую основное средство выбора времени и даты .

Но они не такие уж сексуальные и удобные (я обнаружил). Вы знаете, существует ли виджет, включающий дату и время?

Большое спасибо Люк

Люк
источник

Ответы:

52

В Android нет ничего, что предлагало бы это.

РЕДАКТИРОВАТЬ: Andriod теперь предлагает встроенные средства выбора. Проверить ответ @Oded

CommonsWare
источник
2
Я знаю, что этому ответу больше года, но я думаю, что этот ответ следует обновить. Библиотека DateSlider, на которую Раби ссылается ниже, кажется идеальной для этого.
Стефан Бранчик 07
Я согласен, что этот ответ следует обновить, потому что это отличный виджет. Однако код, на который указывает Rabi, уже немного устарел и содержит некоторые устаревшие методы, например showDialog. Возможно, скоро появится что-то более актуальное.
Eugene van der Merwe
13
Собственно ответ правильный и обновлять не надо. Даже если AndroidDateSlider существует, в Android нет ничего, что предлагало бы эту функцию.
Cristian
4
Я единственный, кого сбивает с толку тот факт, что Google даже не поддерживает один из наиболее широко используемых элементов управления в любых бизнес-приложениях?
l46kok 05
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.
Джонатан
В этом примере нельзя выбрать год.
lostintranslation
Только одна проблема ... при использовании в 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();

Надеюсь, вы сочтете это полезным.

JDJ
источник
действительно хороший! сэкономил мое время! Спасибо ! Однако мне пришлось клонировать код, потому что я думаю, что строка зависимости gradle недействительна?
kuldeep
@ k2ibegin на странице проекта git говорится, что нужно импортировать весь модуль или «клонировать код», в том-то и дело, он не публиковал свое замечательное средство выбора даты и времени ни в одном репозитории. JDJ хороший рабочий человек, отличная библиотека.
Ninja Coding
@JDJ извините, но мне не удалось добавить вашу библиотеку в свой проект, не могли бы вы объяснить, как?
Себастьян Дельгадо
3
Шаг 1: загрузите весь проект, нажав «Клонировать или загрузить», а затем «загрузить ZIP». Шаг 2 извлеките содержимое zip-архива или просто папку ZIP \ SlideDateTimePicker-master \ slideDateTimePicker и скопируйте эту папку в контейнер корневой папки вашего существующего проекта, где вы хотите добавить плагин. Шаг 3 добавьте зависимость через Gradle с помощью проекта компиляции (': slideDateTimePicker') ИЛИ с помощью Android Studio: File> New> Import Project и выберите извлеченную папку и настройте импорт проекта, как обычно, принять, а затем и завершить.
Ninja Coding
2
@JDJ, у нас есть ошибка, на Lollipop или Marshmallow собственные DatePicker и TimePicker не отображаются, вместо этого отображаются компоненты pre-lollipop.
Ninja Coding
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

J-Жаме
источник
Очень красивое элегантное решение. Прекрасно работает. Я наткнулся на несколько мелких деталей .. 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 - это не то, о чем просят, они открывают два отдельных диалога. Было бы лучше увидеть базовый пример кода, где он уже объединен.
Eugene van der Merwe
9

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

ptashek
источник
6

Я разветвлял, обновлял, реорганизовал и совершенствовал проект android-datelider. Сейчас на Github:

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

Cristian
источник
2
у вас есть пример того, как это использовать?
Роджер Кейс
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, на который ссылается Rabi.

pellucide
источник
Неработающей ссылке. Вот вилка от android-wheel .
jk7
2

Я написал небольшой виджет, который позволяет выбирать дату и время.

DateTimeWidget

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

Кристи Уэлш
источник
1

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

Тоан Нгуен
источник
1
Обратите внимание, что ответы только по ссылкам не приветствуются, ответы SO должны быть конечной точкой поиска решения (по сравнению с еще одной остановкой ссылок, которые со временем устаревают). Пожалуйста, рассмотрите возможность добавления здесь отдельного синопсиса, сохранив ссылку в качестве справочной.
клеопатра
1

Вот более компактная версия идеи Джейдипа показывать один диалог за другим. Мне нравится это решение, потому что оно не имеет зависимостей.

        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();
Роджер Кейс
источник