如何在Android中创建日期和时间选择器?[关闭]


128

是否有任何可以同时选择日期和时间的android小部件?我已经使用了基本的时间选择器日期选择器

但是它们并不那么性感和用户友好(我发现)。您是否知道同时包含日期和时间的小部件?

非常感谢Luc

Answers:


52

Android没有内置提供此功能的工具。

编辑:Andriod现在提供了内置选择器。检查@Oded答案


2
我知道此回复已有一年多的历史了,但我认为应该对此回复进行更新。Rabi始终在下面引用的DateSlider库对此似乎是完美的。
Stephan Branczyk 2011年

我同意应该更新此答案,因为这是一个了不起的小部件。但是Rabi指向的代码已经有点过时了,其中包含一些不推荐使用的方法,例如showDialog。也许很快会有新的事物出现。
尤金·范德默

13
实际上答案是正确的,不应更新。即使存在AndroidDateSlider,Android也没有内置提供该功能的东西。
Cristian

4
我是否对Google甚至不支持任何业务应用程序中使用最广泛的控件之一这一事实感到困惑?
l46kok 2015年

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 2015年

只是一个问题...当在android L中使用日期和时间选择器不适合在屏幕上..所以我将linearLayout放置在scrollView中...现在的问题是当我尝试更改布局滚动的时间时因为滚动视图。任何解决方案
Dominic D'Souza

请帮助,它不适用于横向模式,如何解决
Awadesh

1
Android 6.0或
更高

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

最简单的方式之一
Vicky Thakor

3
呼叫要求API级别为
24。– RRaj

27

Android的DialogFragment中结合了DatePicker和TimePicker

我创建了一个图书馆来做到这一点。它还具有可自定义的颜色!

使用非常简单。

首先,您创建一个侦听器:

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的好人,伟大的lib。
Ninja Coding

@JDJ对不起,但我无法将您的库添加到我的项目中,您能解释一下吗?
塞巴斯蒂安·德尔加多

3
步骤1通过单击“克隆或下载”下载整个项目,然后“下载ZIP”。步骤2提取zip内容,或者仅提取ZIP \ SlideDateTimePicker-master \ slideDateTimePicker文件夹,然后将该文件夹复制到现有项目的文件夹容器中,您要添加插件。第3步通过Gradle通过编译项目(':slideDateTimePicker')或通过Android Studio 添加依赖项:文件>新建>导入项目,然后选择提取的文件夹并配置项目导入,通常接受并下一步完成。
忍者编码

2
@JDJ我们在棒棒糖或棉花糖上存在一个错误,未显示本地DatePicker和TimePicker,而是显示了棒棒糖之前的组件。
忍者编码

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项目-感谢您的分享
Gene Bo

13

您所链接的URL,显示了如何弹出一个带有时间选择器的对话框以及另一个带有日期选择器的对话框。但是,您需要注意,可以直接在自己的布局中使用这些UI小部件。您可以在同一视图中构建自己的对话框,其中同时包含TimePicker和DatePicker,从而完成我认为要查找的内容。

换句话说,不使用TimePickerDialog和DatePickerDialog,而是直接在您自己的对话框或活动中使用UI小部件TimePickerDatePicker


1
我同意@Jaydeep Khamar的解决方案不是所要的,它们正在打开两个单独的对话框。最好查看已经合并的基本示例代码。
Eugene van der Merwe 2012年

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-wheel项目,它非常接近iOS的UIDatePicker对话框。

它提供了一个垂直滑块来选择任何内容(包括日期和时间)。如果您更喜欢水平滑块,则Rabi引用的DateSlider更好。


链接断开。这是android-wheel叉子
jk7


1

我创建了一个警报对话框,其中将日期选择器和时间选择器结合在一起。您可以在https://github.com/nguyentoantuit/android上获取代码 注意:DateTimePicker是一个库


1
请注意,不鼓励仅链接的答案,因此SO答案应该是搜索解决方案的终点(与引用的另一种中途停留相比,随着时间的流逝,它们往往会过时)。请考虑在此处添加独立的简介,并保留该链接作为参考。
kleopatra 2013年

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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.