Android开发之日期时间控件选择

文章目录

  • 前言
  • 一、创建弹出Layout
    • 1.1 新建Layout,修改样式为LinearLayout
    • 1.2 Layout中添加日期和时间控件
  • 二、新建DateTimeDialog
    • 2.1 创建静态方法
      • 2.1.1 创建SetDateDialog,用于选择日期
      • 2.1.2 SetDateDialog中绑定textView的click事件
    • 2.2 引用
  • 三. 总结

前言

整合Android原生控件(日期控件DatePicker、时间控件TimePicker)实现选择日期、时间绑定。
本文仅仅是一种参考,不光是时间控件,自定义的Layout一样可以采用这种方式。
涉及技术要点:
1.控件事件绑定
2.弹出框AlertDialog
3.日期格式化SimpleDateFormat


一、创建弹出Layout

1.1 新建Layout,修改样式为LinearLayout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"></LinearLayout>

1.2 Layout中添加日期和时间控件

注意需要将控件的calendarViewShown指定为false及datePickerMode属性指定为spinner

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><DatePickerandroid:id="@+id/dialog_datetime_date_picker"android:layout_width="match_parent"android:layout_height="wrap_content"android:calendarViewShown="false"android:datePickerMode="spinner"/><TimePickerandroid:id="@+id/dialog_datetime_time_picker"android:layout_width="match_parent"android:layout_height="wrap_content"android:calendarViewShown="false"android:datePickerMode="spinner" /></LinearLayout>

二、新建DateTimeDialog

创建DateTimeDialog类是为了将方法封装,以便我项目多次调用

public class DateTimeDialog {}

2.1 创建静态方法

2.1.1 创建SetDateDialog,用于选择日期

public static void SetDateDialog(Context context, Activity activity, TextView textView, String... title) {}

这里我们将引用控件的context、activity作为参数传入方法中,方便我们动态加载Layout和指定AlertDialog弹出所在的Activity,避免弹出框无法显示。
textView参数为需要绑定选择的控件,并且在选择之后,会将选择的日期返回给textView
titile是可选参数,指定弹出框的标题,不指定的话,会默认为“选择日期”

2.1.2 SetDateDialog中绑定textView的click事件

给textView绑定事件后,在用户点击控件时即可执行相应的事件内容,在此我们需要的是用户点击控件时,弹出日期选择框。

textView.setOnClickListener(view -> {AlertDialog.Builder builder = new AlertDialog.Builder(activity);builder.setView(view1);builder.create().show();
});

由于我们的控件中含有时间控件,需要隐藏

            View view1 = LayoutInflater.from(context).inflate(R.layout.dialog_datetime, null);final TimePicker timePicker = view1.findViewById(R.id.dialog_datetime_time_picker);timePicker.setVisibility(View.GONE);

如果textView有默认值,则在弹出的时候需要将textView的日期带入弹出框中

            final DatePicker datePicker = view1.findViewById(R.id.dialog_datetime_date_picker);Calendar calendar;String strDate = textView.getText().toString();calendar = convertDateToCalendar(strDate);datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE), null);

设置弹出框的标题

            if (title != null && title.length > 0) {builder.setTitle(title[0]);} elsebuilder.setTitle("选择日期");

实现弹出框的按钮事件:
点击确定时,绑定值给textView,并关闭弹窗;点击取消时,直接关闭天窗;点击现在时,将当前时间传给textView,并关闭弹窗。

            builder.setPositiveButton("确 定", (dialog, i) -> {//日期格式int year = datePicker.getYear();int month = datePicker.getMonth() + 1;int dayOfMonth = datePicker.getDayOfMonth();textView.setText(String.format(Locale.getDefault(), "%d年%d月%d日 ", year, month, dayOfMonth));dialog.cancel();});builder.setNegativeButton("取 消", (dialog, which) -> dialog.cancel());builder.setNeutralButton("现 在", (dialog, i) -> {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年M月d日",Locale.getDefault());// HH:mm:ss//获取当前时间Date date = new Date(System.currentTimeMillis());textView.setText(simpleDateFormat.format(date));dialog.cancel();});

以下是完整代码:

    public static void SetDateDialog(Context context, Activity activity, TextView textView, String... title) {textView.setOnClickListener(view -> {AlertDialog.Builder builder = new AlertDialog.Builder(activity);View view1 = LayoutInflater.from(context).inflate(R.layout.dialog_datetime, null);final DatePicker datePicker = view1.findViewById(R.id.dialog_datetime_date_picker);final TimePicker timePicker = view1.findViewById(R.id.dialog_datetime_time_picker);timePicker.setIs24HourView(true);Calendar calendar;String strDate = textView.getText().toString();calendar = convertDateToCalendar(strDate);datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE), null);timePicker.setHour(calendar.get(Calendar.HOUR_OF_DAY));timePicker.setMinute(calendar.get(Calendar.MINUTE));timePicker.setVisibility(View.GONE);
//            datePicker.setCalendarViewShown(false);//设置Date布局builder.setView(view1);if (title != null && title.length > 0) {builder.setTitle(title[0]);} elsebuilder.setTitle("选择日期");builder.setPositiveButton("确 定", (dialog, i) -> {//日期格式int year = datePicker.getYear();int month = datePicker.getMonth() + 1;int dayOfMonth = datePicker.getDayOfMonth();textView.setText(String.format(Locale.getDefault(), "%d年%d月%d日 ", year, month, dayOfMonth));dialog.cancel();});builder.setNegativeButton("取 消", (dialog, which) -> dialog.cancel());builder.setNeutralButton("现 在", (dialog, i) -> {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年M月d日",Locale.getDefault());// HH:mm:ss//获取当前时间Date date = new Date(System.currentTimeMillis());textView.setText(simpleDateFormat.format(date));dialog.cancel();});builder.create().show();});}

同样的方式我们再实现选择日期时间的方法,具体不再赘述,上代码:

   public static void SetDateTimeDialog(Context context, Activity activity, TextView textView, String... title) {textView.setOnClickListener(view -> {AlertDialog.Builder builder = new AlertDialog.Builder(activity);View view1 = LayoutInflater.from(context).inflate(R.layout.dialog_datetime, null);final DatePicker datePicker = view1.findViewById(R.id.dialog_datetime_date_picker);final TimePicker timePicker = view1.findViewById(R.id.dialog_datetime_time_picker);timePicker.setIs24HourView(true);
//            datePicker.setCalendarViewShown(false);Calendar calendar;String strDate = textView.getText().toString();calendar = convertDateToCalendar(strDate);datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE), null);timePicker.setHour(calendar.get(Calendar.HOUR_OF_DAY));timePicker.setMinute(calendar.get(Calendar.MINUTE));//设置Date布局builder.setView(view1);if (title != null && title.length > 0) {builder.setTitle(title[0]);} elsebuilder.setTitle("选择时间");builder.setPositiveButton("确 定", (dialog, i) -> {//日期格式int year = datePicker.getYear();int month = datePicker.getMonth() + 1;int dayOfMonth = datePicker.getDayOfMonth();int hour = timePicker.getHour();int min = timePicker.getMinute();
//                    timePicker.getSecond();textView.setText(String.format(Locale.getDefault(), "%d年%d月%d日 %d:%d", year, month, dayOfMonth, hour, min));dialog.cancel();});builder.setNegativeButton("取 消", (dialog, which) -> dialog.cancel());builder.setNeutralButton("现 在", (dialog, i) -> {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年M月d日 HH:mm", Locale.getDefault());// HH:mm:ss//获取当前时间Date date = new Date(System.currentTimeMillis());textView.setText(simpleDateFormat.format(date));dialog.cancel();});builder.create().show();});}

文中提到的convertDateToCalendar是笔者用于日期转换的,您可以根据自己的需要去灵活实现

    private static Calendar convertDateToCalendar(String strDate) {int year;int month;int day;int hour;int minute;Calendar calendar = Calendar.getInstance();//获取当前时间Date date = new Date(System.currentTimeMillis());calendar.setTime(date);
//        calendar.add(Calendar.MONTH,1);year = calendar.get(Calendar.YEAR);month = calendar.get(Calendar.MONTH);day = calendar.get(Calendar.DATE);hour = calendar.get(Calendar.HOUR_OF_DAY);minute = calendar.get(Calendar.MINUTE);if (strDate != null && !strDate.equals("")) {if (strDate.contains(":")) {strDate = strDate.split(":")[1];}strDate = strDate.replace("年", "-").replace("月", "-").replace("日", "").replace(".", "").replace(" ", "-").replace(":", "-");Log.d("liuwz", "convertDateToCalendar: "+strDate);if (strDate.split("-").length >= 3) {year = Integer.parseInt(strDate.split("-")[0]);month = Integer.parseInt(strDate.split("-")[1]);day = Integer.parseInt(strDate.split("-")[2]);if (strDate.split("-").length >= 5) {hour = Integer.parseInt(strDate.split("-")[3]);minute = Integer.parseInt(strDate.split("-")[4]);}calendar.set(year, month, day, hour, minute);calendar.add(Calendar.MONTH, -1);} else if (strDate.split("-").length >= 2) {hour = Integer.parseInt(strDate.split("-")[0]);minute = Integer.parseInt(strDate.split("-")[1]);calendar.set(year, month, day, hour, minute);}}return calendar;}

至此已经大功告成,下面看下如何引用

2.2 引用

在任意需要用到选择时间的Activity的onCreate方法中添加下面一句代码即可:

               DateTimeDialog.SetDateDialog(getApplicationContext(), MainActivity.this, timeSelectView, "请选择日期");

将其中的MainActivity修改为您当前的Activity;将timeSelectView 修改为您页面中的时间TextView或者EditView,“请选择日期”为可选参数,可忽略。

三. 总结

本文仅仅为了使用方便而对AlertDialog进行了封装,用的是Android的原生控件,写在此处仅仅给新入门的朋友们以参考。

Android开发之日期时间控件选择相关推荐

  1. bootstrap日期时间控件

    datetime控件 Bootstrap的日期时间控件,使用非常的简单. 首先,添加日期时间控件的引用 @*datetime控件*@<link href="~/Content/Boot ...

  2. Androi常用日期时间控件

    虽然简单但是还是想记录下,使用Android自带日期时间控件,界面及源码如下: 主Activity源码: public class MainActivity extends Activity {    ...

  3. layui 日期范围选择器_layui时间控件选择时间范围的实现方法

    解决layui时间控件清空之后无法正常使用的问题,以及时间范围的选择 共有两种解决方式: 方式一(layui 1.x): html代码: placeholder="开始时间(修改时间)&qu ...

  4. HTML5超简单的日期时间控件

    HTML5超简单的日期时间控件 时间都是宝贵的,尤其是开发人员,所以为了节省时间,我直接展示下效果,符合您的要求就采纳,不符合,就不用继续看了! 1.1 日期控件效果: 1.2 时间控件展示: 2.1 ...

  5. python日历gui_python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例...

    PyQt5日期时间控件QDateTimeEdit介绍 QDateTimeEdit是一个允许用户编辑日期时间的控件,可以使用键盘上的上下键头按钮来增加或减少日期的时间值,QDateTimeEdit通过s ...

  6. 轻量级的日期时间控件Pikaday

    今天看到一个网友分享的一篇文章,有关轻量级的日期时间控件Pikaday,感觉很实用.在这里总结一下,方便日后使用.因为之前也遇到过类似的问题,My97datepicker插件样式过于老旧,但又没有其它 ...

  7. jquery日期时间控件

    代码下载地址:  jquery日期时间控件下载地址 .  工作中用到, 这里分享一下, 避免重复摸索劳动. 一. HTML 文件    <!DOCTYPE HTML PUBLIC "- ...

  8. WPF自定义日期时间控件

    WPF自定义日期时间控件 一.需求分析 二.功能实现 一.需求分析 在工作中遇到的项目中,大部分软件是处于全屏运行状态,这时候就需要在软件的界面上加上日期时间那些,方便用户查看当前时间. 二.功能实现 ...

  9. android开发中为MultiAutoCompleteTextView控件添加其他分隔符

    android开发中为MultiAutoCompleteTextView控件添加其他分隔符,例如:分隔符改为分号";" zs;ls;ww;xm //SemicolonTokeniz ...

最新文章

  1. java nodelist 快速排序,【Leetcode】Sort List in java,你绝对想不到我是怎么做的^^我写完过了我自己都觉得好jian~...
  2. [NOI2008]志愿者招募
  3. android -------- NDK 入门指南
  4. 阻燃防火电缆在数据中心建设中的应用
  5. SAP的软件是如何深刻影响着世界的?
  6. 高扫后督解决方案 力助银行内部核查
  7. 计算机不能显示可移动磁盘咋办,U盘插上电脑不显示“可移动磁盘”该怎么办...
  8. C实现web service
  9. Java_Date_01_判断两个时间相差的天数
  10. n=sizeof(a)/sizeof(int)的含义(C语言)
  11. Ubuntu 20.04 锐捷客户端安装记录
  12. 大型公建能耗监管系统
  13. 媒体聚焦:西电卡门——12月24日更新
  14. arcgis用python字段自动编号_属性表字段自动编号
  15. DVWA靶机-存储型XSS漏洞(Stored)
  16. 零知识证明 - bellman源码分析
  17. C# winform表格datagridview行高自动设置问题
  18. ndnSIM学习(十)——apps之ndn-producer.cpp和ndn-consumer.cpp源码分析
  19. Win11系统鼠标右键无法打开一直转圈解决方法
  20. java null转空_Java对象为空时,将null转换为 保存值为空的属性

热门文章

  1. 物理像素,逻辑像素(pt),css像素(px),像素比(dpr)都是什么?px,em,rem等 都是什么?有什么区别?
  2. CryptoDickbutts 以太坊 NFT 日销量飙升 690%
  3. 《生物信息学:导论与方法》----新一代测序NGS:重测序的回帖和变异鉴定----听课笔记(九)
  4. 生物信息:三维基因组,转录组,重测序,chip-seq 视频课程 24节全
  5. 图文结合-ViLBERT
  6. BUUOJ 极客大挑战 2019套餐
  7. STM32串口之奇偶校验设置
  8. Python 环境搭建(Win 安装以及Mac OS 安装)
  9. cell2mat(A)什么意思
  10. static有什么用途