【问题标题】:How to create a date and time picker in Android? [closed]如何在 Android 中创建日期和时间选择器? [关闭]
【发布时间】:2011-01-04 13:25:04
【问题描述】:

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

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

非常感谢, 卢克

【问题讨论】:

标签: android android-widget


【解决方案1】:

DatePickerTimePicker 都放入布局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();

【讨论】:

  • 出色的例子,谢谢。一点......你可能想要 alertDialog.dismiss();在 onClick 实现结束时。
  • 在这个例子中不能选择年份。
  • 只有一个问题...在 android L 中使用时,日期和时间选择器不适合屏幕...所以我将 linearLayout 放在滚动视图中...现在问题是当我尝试更改布局滚动的时间,因为scrollView..对此的任何解决方案
  • 请帮忙,横向模式不适合,如何解决
  • Android 6.0+ 这个布局看起来很丑;(static.pychat.org/photo/f1qRFo31_Screenshot_20170214-123713.png
【解决方案2】:

使用此功能,您可以将日期和时间一一绘制,然后将其设置为全局变量日期。没有库就没有 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();
}

【讨论】:

  • 最简单的方法之一
  • 调用需要 API 级别 24。
  • 如何获取 datePicker 对象?我想禁用过去的日期。
【解决方案3】:

Android 中没有任何内置功能可以提供此功能。

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

【讨论】:

  • 我知道这个回复已经有一年多了,但我认为应该更新这个回复。 Rabi 下面一路引用的 DateSlider 库似乎很适合这个。
  • 我同意这个答案应该更新,因为这是一个很棒的小部件。然而,Rabi 指出的代码已经有点过时了,并且包含一些不推荐使用的方法,例如showDialog。或许很快就会有更新的东西出现。
  • 其实答案是正确的,不应该更新。即使存在 AndroidDateSlider,Android 中也没有提供该功能的内置功能。
  • 只有我一个人对 Google 甚至不支持任何商业应用程序中使用最广泛的控件之一这一事实感到困惑吗?
【解决方案4】:

我创建了一个library 来执行此操作。它还具有可自定义的颜色!

使用起来非常简单。

首先你创建一个监听器:

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 依赖字符串无效?
  • @k2ibegin 项目的 git 页面说要导入整个模块或“克隆代码”,这就是重点,他没有在任何存储库中发布他很棒的日期时间选择器。 JDJ 干得好,很棒的库。
  • @JDJ 抱歉,我无法将你的库添加到我的项目中,你能解释一下如何吗?
  • 第 1 步通过单击“克隆或下载”然后“下载 ZIP”下载整个项目第 2 步解压缩 zip 内容,或仅ZIP\SlideDateTimePicker-master\ slideDateTimePicker 文件夹并将该文件夹复制到您想要添加插件的现有项目的 root 文件夹容器中。 步骤 3 通过 Gradle 添加依赖项,使用 compile project(':slideDateTimePicker') 或使用 Android Studio:File > New > Import Project 并选择提取的文件夹并配置项目导入通常接受并下一步并完成。
  • @JDJ 我们有一个错误,在 Lollipop 或 Marshmallow 上未显示原生 DatePicker 和 TimePicker,而是显示了 pre-lollipop 组件。
【解决方案5】:

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>

【讨论】:

    【解决方案6】:

    我还想结合使用 DatePicker 和 TimePicker。 所以我创建了一个 API 来在一个界面中处理这两种情况! :)

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

    你也可以使用SublimePicker

    【讨论】:

    • 非常优雅的解决方案。效果很好。我遇到了一些小细节.. 1) AM/PM 标签被截断,所以我必须在样式中设置较小的字体大小:&lt;item name="android:textSize"&gt;11sp&lt;/item&gt; 并删除粗体设置。 2) 看起来必须调用setDefaultDateTime(..),否则会出现运行时异常......所以我只用Calendar.getInstance().getTime() 作为参数来调用它。迄今为止我见过的日期选择器的最佳 github 项目 - 感谢分享它
    【解决方案7】:

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

    换句话说,不要使用 TimePickerDialog 和 DatePickerDialog,只需在您自己的对话框或活动中直接使用 UI 小部件 TimePickerDatePicker 即可。p>

    【讨论】:

    • 我同意@Jaydeep Khamar 的解决方案不是所要求的,它们正在打开两个单独的对话框。最好查看已经组合的基本示例代码。
    【解决方案8】:

    我在我的一个项目中遇到了同样的问题,因此决定制作一个自定义小部件,该小部件在一个用户友好的对话框中同时具有日期和时间选择器。您可以在http://code.google.com/p/datetimepicker/ 获取源代码和示例。该代码在 Apache 2.0 下获得许可。

    【讨论】:

      【解决方案9】:

      我对 android-dateslider 项目进行了分叉、更新、重构和 mavenized。它现在在 Github 上:

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

      【讨论】:

      • 你有如何使用这个的例子吗?
      【解决方案10】:

      您可以使用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 &amp; 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);
        }
        

      【讨论】:

        【解决方案11】:
        【解决方案12】:

        我编写了一个小部件,让您可以选择日期和时间。

        DateTimeWidget

        【讨论】:

        • 你好。很抱歉发布了 necro 帖子,但是否可以将您的小部件导入我的 .xml 布局文件?
        【解决方案13】:

        另一个选项是android-wheel 项目,它非常接近 iOS 的 UIDatePicker 对话框。

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

        【讨论】:

        【解决方案14】:

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

        【讨论】:

        • 请注意,不鼓励link-only answers,所以答案应该是搜索解决方案的终点(与另一个参考文献的中途停留相比,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
        【解决方案15】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-06
          • 2011-08-14
          • 2015-01-19
          • 2012-10-10
          • 2010-11-17
          • 2011-02-20
          相关资源
          最近更新 更多