资讯专栏INFORMATION COLUMN

Android之日期时间选择控件DatePicker和TimePicker

cpupro / 1402人阅读

摘要:注为了便于区分,本文将选择年月日的控件称为日期选择控件,将选择时分的控件称为时间选择控件。初始化控件和创建相关变量初始化控件初始化控件,并为两个设置监听事件创建相关变量使用类获取当前的日期时间。

这个月根据需求在项目中做了一个时间选择器,虽然没有用到Android原生的时间选择控件,但我羞愧地发现自己竟然从来没有用过这方面控件!趁现在有时间,赶紧查缺补漏,写一篇博客吧。

(注:为了便于区分,本文将选择年月日的控件称为日期选择控件,将选择时分的控件称为时间选择控件。)

1、创建项目

新建一个项目,MainActivity的布局如下:

</>复制代码

界面效果如下:

点击条目之后就会弹出日期或者时间选择控件,点击确定按钮后,就会将选择的结果显示在浅灰色的方框中。

2、初始化控件和创建相关变量 2.1 初始化控件

初始化控件,并为两个LinearLayout设置监听事件:

</>复制代码

  1. private void initView() {
  2. llDate = (LinearLayout) findViewById(R.id.ll_date);
  3. tvDate = (TextView) findViewById(R.id.tv_date);
  4. llTime = (LinearLayout) findViewById(R.id.ll_time);
  5. tvTime = (TextView) findViewById(R.id.tv_time);
  6. llDate.setOnClickListener(this);
  7. llTime.setOnClickListener(this);
  8. }
2.2 创建相关变量

使用Calendar类获取当前的日期时间。

</>复制代码

  1. private int year, month, day, hour, minute;
  2. private void initDateTime() {
  3. Calendar calendar = Calendar.getInstance();
  4. year = calendar.get(Calendar.YEAR);
  5. month = calendar.get(Calendar.MONTH) + 1;
  6. day = calendar.get(Calendar.DAY_OF_MONTH);
  7. hour = calendar.get(Calendar.HOUR);
  8. minute = calendar.get(Calendar.MINUTE);
  9. }

注意,calendar.get(Calendar.MONTH)获取到的月份下标是从0开始的,值为0时表示一月份,1时表示二月份,以此类推,所以必须加上1。

创建两个StringBuffer变量,用于拼接获取到的时间数据。

</>复制代码

  1. private StringBuffer date, time;
3、日期选择控件DatePicker

这里我们选择自定义AlertDialog的形式来显示选择控件。
(关于AlertDialog的使用可以参考我的这篇文章:Android之AlertDialog的基础使用)

日期选择控件自定义布局dialog_date.xml如下:

</>复制代码

只需放置一个DatePicker控件即可。不同版本的Android的DatePicker控件外观可能有所不同,比如Android4.4上是滚轮的形式,在7.0上则是一个日历视图。为了避免在4.4等低版本上显示出日历视图占用太多空间,可以将android:calendarViewShown属性设为fasle。

继承接口DatePicker.OnDateChangedListener,实现日期改变的监听方法:

</>复制代码

  1. @Override
  2. public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
  3. this.year = year;
  4. this.month = monthOfYear;
  5. this.day = dayOfMonth;
  6. }

这样就可以获取到用户选择的年月日数值了。
下面就是创建AlertDialog了:

</>复制代码

  1. AlertDialog.Builder builder = new AlertDialog.Builder(context);
  2. builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
  3. @Override
  4. public void onClick(DialogInterface dialog, int which) {
  5. if (date.length() > 0) { //清除上次记录的日期
  6. date.delete(0, date.length());
  7. }
  8. tvDate.setText(date.append(String.valueOf(year)).append("年").append(String.valueOf(month)).append("月").append(day).append("日"));
  9. dialog.dismiss();
  10. }
  11. });
  12. builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
  13. @Override
  14. public void onClick(DialogInterface dialog, int which) {
  15. dialog.dismiss();
  16. }
  17. });
  18. final AlertDialog dialog = builder.create();
  19. View dialogView = View.inflate(context, R.layout.dialog_date, null);
  20. final DatePicker datePicker = (DatePicker) dialogView.findViewById(R.id.datePicker);
  21. dialog.setTitle("设置日期");
  22. dialog.setView(dialogView);
  23. dialog.show();
  24. //初始化日期监听事件
  25. datePicker.init(year, month - 1, day, this);

DatePicker需要调用init方法初始化,传入年月日数值和OnDateChangedListener对象。要记住我们前面在给month赋值时已经是对应的月份数值了,而这里需要的是下标值,所以要减1。

运行之后,效果如图所示:

4、时间选择控件TimePicker

这里我们同样需要一个自定义的AlertDialog布局:

</>复制代码

同样,我们需要监听时和分的变化,所以继承TimePicker.OnTimeChangedListener接口,实现以下的方法:

</>复制代码

  1. @Override
  2. public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
  3. this.hour = hourOfDay;
  4. this.minute = minute;
  5. }

时间选择控件的初始化跟日期选择控件的有所不同,DatePicker一个init方法解决,但TimePicker的工作量稍大一点。看下面代码:

</>复制代码

  1. timePicker.setCurrentHour(hour);
  2. timePicker.setCurrentMinute(minute);
  3. timePicker.setIs24HourView(true); //设置24小时制
  4. timePicker.setOnTimeChangedListener(this);

除了要设置当前要显示的时和分之外,还要设置是24小时制还是12小时制。

效果图如下:

5、完整的MainActivity代码

</>复制代码

  1. package com.lindroid.datetimepickerdemo;
  2. import android.app.AlertDialog;
  3. import android.content.Context;
  4. import android.content.DialogInterface;
  5. import android.os.Bundle;
  6. import android.support.v7.app.AppCompatActivity;
  7. import android.view.View;
  8. import android.widget.DatePicker;
  9. import android.widget.LinearLayout;
  10. import android.widget.TextView;
  11. import android.widget.TimePicker;
  12. import java.util.Calendar;
  13. public class MainActivity extends AppCompatActivity implements View.OnClickListener, DatePicker.OnDateChangedListener, TimePicker.OnTimeChangedListener {
  14. private Context context;
  15. private LinearLayout llDate, llTime;
  16. private TextView tvDate, tvTime;
  17. private int year, month, day, hour, minute;
  18. //在TextView上显示的字符
  19. private StringBuffer date, time;
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24. context = this;
  25. date = new StringBuffer();
  26. time = new StringBuffer();
  27. initView();
  28. initDateTime();
  29. }
  30. /**
  31. * 初始化控件
  32. */
  33. private void initView() {
  34. llDate = (LinearLayout) findViewById(R.id.ll_date);
  35. tvDate = (TextView) findViewById(R.id.tv_date);
  36. llTime = (LinearLayout) findViewById(R.id.ll_time);
  37. tvTime = (TextView) findViewById(R.id.tv_time);
  38. llDate.setOnClickListener(this);
  39. llTime.setOnClickListener(this);
  40. }
  41. /**
  42. * 获取当前的日期和时间
  43. */
  44. private void initDateTime() {
  45. Calendar calendar = Calendar.getInstance();
  46. year = calendar.get(Calendar.YEAR);
  47. month = calendar.get(Calendar.MONTH) + 1;
  48. day = calendar.get(Calendar.DAY_OF_MONTH);
  49. hour = calendar.get(Calendar.HOUR);
  50. minute = calendar.get(Calendar.MINUTE);
  51. }
  52. @Override
  53. public void onClick(View v) {
  54. switch (v.getId()) {
  55. case R.id.ll_date:
  56. AlertDialog.Builder builder = new AlertDialog.Builder(context);
  57. builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
  58. @Override
  59. public void onClick(DialogInterface dialog, int which) {
  60. if (date.length() > 0) { //清除上次记录的日期
  61. date.delete(0, date.length());
  62. }
  63. tvDate.setText(date.append(String.valueOf(year)).append("年").append(String.valueOf(month)).append("月").append(day).append("日"));
  64. dialog.dismiss();
  65. }
  66. });
  67. builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
  68. @Override
  69. public void onClick(DialogInterface dialog, int which) {
  70. dialog.dismiss();
  71. }
  72. });
  73. final AlertDialog dialog = builder.create();
  74. View dialogView = View.inflate(context, R.layout.dialog_date, null);
  75. final DatePicker datePicker = (DatePicker) dialogView.findViewById(R.id.datePicker);
  76. dialog.setTitle("设置日期");
  77. dialog.setView(dialogView);
  78. dialog.show();
  79. //初始化日期监听事件
  80. datePicker.init(year, month - 1, day, this);
  81. break;
  82. case R.id.ll_time:
  83. AlertDialog.Builder builder2 = new AlertDialog.Builder(context);
  84. builder2.setPositiveButton("设置", new DialogInterface.OnClickListener() {
  85. @Override
  86. public void onClick(DialogInterface dialog, int which) {
  87. if (time.length() > 0) { //清除上次记录的日期
  88. time.delete(0, time.length());
  89. }
  90. tvTime.setText(time.append(String.valueOf(hour)).append("时").append(String.valueOf(minute)).append("分"));
  91. dialog.dismiss();
  92. }
  93. });
  94. builder2.setNegativeButton("取消", new DialogInterface.OnClickListener() {
  95. @Override
  96. public void onClick(DialogInterface dialog, int which) {
  97. dialog.dismiss();
  98. }
  99. });
  100. AlertDialog dialog2 = builder2.create();
  101. View dialogView2 = View.inflate(context, R.layout.dialog_time, null);
  102. TimePicker timePicker = (TimePicker) dialogView2.findViewById(R.id.timePicker);
  103. timePicker.setCurrentHour(hour);
  104. timePicker.setCurrentMinute(minute);
  105. timePicker.setIs24HourView(true); //设置24小时制
  106. timePicker.setOnTimeChangedListener(this);
  107. dialog2.setTitle("设置时间");
  108. dialog2.setView(dialogView2);
  109. dialog2.show();
  110. break;
  111. }
  112. }
  113. /**
  114. * 日期改变的监听事件
  115. *
  116. * @param view
  117. * @param year
  118. * @param monthOfYear
  119. * @param dayOfMonth
  120. */
  121. @Override
  122. public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
  123. this.year = year;
  124. this.month = monthOfYear;
  125. this.day = dayOfMonth;
  126. }
  127. /**
  128. * 时间改变的监听事件
  129. *
  130. * @param view
  131. * @param hourOfDay
  132. * @param minute
  133. */
  134. @Override
  135. public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
  136. this.hour = hourOfDay;
  137. this.minute = minute;
  138. }
  139. }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67106.html

相关文章

  • Android自定义滚动式时间选择器(在他人基础上修改)

    摘要:但是如果用户先确定了日,再去选择月的话,之后月份改变,日数就会重新从开始。 尽管Android给我们提供了时间选择控件DatePicker和TimePicker(它们的使用方法可以参考我的这篇文章Android之日期时间选择控件DatePicker和TimePicker),但无奈我的项目主色调是土豪金和高级黑,原生的控件用在里面显得格格不入,特别是为了兼容低版本的系统之后显示的是2.x...

    陈江龙 评论0 收藏0
  • 移动端material风格日期时间选择

    摘要:好多时候在移动端需要一个的日期选择器,由于在应用上有可能应用各种框架库等所以说一个无依赖的,这样易于上层进行封装。主要包含两种选择器日期和时间。 好多时候在移动端需要一个的日期选择器,由于在应用上有可能应用各种框架库(Vue.js, React.js, zepto.js等);所以说一个无依赖的,这样易于上层进行封装。直接开门见山,先来张动图看看效果: showImg(https://s...

    philadelphia 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<