本文总结了Android中DatePicker和TimePicker的实践以及对遇到问题的几点反思:

先贴出代码:

布局代码:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <TextView        android:text="请选择日期和时间"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center_horizontal"        android:paddingTop="5dp"        android:paddingBottom="5dp"/>    <DatePicker        android:id="@+id/datePicker"        android:layout_width="wrap_content"        android:layout_height="300dp"        android:layout_gravity="center_horizontal"        android:calendarViewShown="true"        android:startYear="2000"        android:endYear="2017"        android:spinnersShown="true">    DatePicker>    <TimePicker        android:layout_marginTop="5dp"        android:id="@+id/timePicker"        android:layout_width="wrap_content"        android:layout_height="100dp"        android:timePickerMode="spinner"        android:layout_gravity="center_horizontal">    TimePicker>    <EditText    android:id="@+id/editText"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:editable="false"    android:cursorVisible="false"/>LinearLayout>

这里需要注意的是

android:timePickerMode="spinner"

这一属性定义。
从字面意义上来理解,spinner指的是纺纱机。当然在安卓中指的是这样的形状。对应如图的控件:

注意,如果不声明为spinner,则默认为clock模式。
如下图所示:

package com.example.chenlong.datepickerandtimerpickertest;import android.icu.util.Calendar;import android.os.Build;import android.support.annotation.RequiresApi;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.DatePicker;import android.widget.EditText;import android.widget.TimePicker;import android.widget.Toast;public class MainActivity extends AppCompatActivity {    private int year;    private int month;    private int day;    private int hour;    private int minute;    @RequiresApi(api = Build.VERSION_CODES.N)    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);//        获取当前的年、月、日、小时、分钟        Calendar calendar = Calendar.getInstance();        year = calendar.get(Calendar.YEAR);        month = calendar.get(Calendar.MONTH);        day = calendar.get(Calendar.DAY_OF_MONTH);        hour = calendar.get(calendar.HOUR);        minute =calendar.get(Calendar.MINUTE);        DatePicker datePicker = (DatePicker) findViewById(R.id.datePicker);        TimePicker timePicker = (TimePicker) findViewById(R.id.timePicker);//        初始化DatePicker控件,初始化时指定监听器        datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() {            @Override            public void onDateChanged(DatePicker datePicker, int year, int month, int day) {                MainActivity.this.year = year;                MainActivity.this.month =month;                MainActivity.this.day = day;//                显示当前日期、时间                showDate(year,month +1,day,hour,minute);            }        });//        为TimePicker指定监听器        timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {            @Override            public void onTimeChanged(TimePicker timePicker, int hourOfDay, int minute) {                MainActivity.this.hour = hourOfDay;                MainActivity.this.minute = minute;//                显示当前日期、时间                showDate(year,month,day,hour,minute);            }        });    }    //        定义在EditText中显示当前日期、时间的方法//    注意showDate()方法的修饰符为private    private void showDate (int year, int month ,int day , int hour, int minute){        EditText editText = (EditText) findViewById(R.id.editText);        editText.setText("您选择的日期为:" + year+"年"+month +"月"+ day+"日"+hour +"时"+minute+"分");    }}

另外值得注意的是Calendar类的getInstance()方法:

getInstance                added in API level 1Calendar getInstance (TimeZone zone)Gets a calendar using the specified time zone and default locale. The Calendar returned is based on the current time in the given time zone with the default FORMAT locale.

中文意思就是:
getInstance方法,可以传入一个时区参数,并会基于当前时间返回一个calendar对象。
YEAR, DAY_OF_MONTH等都是Calendar预先定义的常量,配合get()方法,即可返回对应的当前时间参数。

另外可以看到两个触发器中,均有showDate()方法:

//        初始化DatePicker控件,初始化时指定监听器        datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() {            @Override            public void onDateChanged(DatePicker datePicker, int year, int month, int day) {                MainActivity.this.year = year;                MainActivity.this.month =month;                MainActivity.this.day = day;//                显示当前日期、时间                showDate(year,month +1,day,hour,minute);            }        });
//        为TimePicker指定监听器        timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {            @Override            public void onTimeChanged(TimePicker timePicker, int hourOfDay, int minute) {                MainActivity.this.hour = hourOfDay;                MainActivity.this.minute = minute;//                显示当前日期、时间                showDate(year,month,day,hour,minute);            }        });
  • 这里程序相当于只用了一个EditText控件和一个showDate()方法,就实现了对两个监听器做出响应。
  • 第一个监听器响应时改变的实际只有年月日的值
  • 第二个监听器响应时改变的实际只有小时和分钟的值
  • 但是调用showDate()方法总是传入五个参数
  • 可以说是对 类成员变量 作用域的妙用

更多相关文章

  1. .NET跨平台开发之Xamarin.Android介绍与生命周期【2】
  2. Android(安卓)Layout XML属性
  3. 【安卓学习笔记】Android(安卓)Studio第9课——进度条ProgressBa
  4. android Layout XML属性
  5. Android(安卓)SDK下载慢的最给力解决办法
  6. Android(安卓)Layout XML属性
  7. Android中的常用控件之进度条(ProgressBar)
  8. Android(安卓)Toast 长期显示解决方案
  9. Android自动检测版本及自动升级

随机推荐

  1. Android中不被硬件加速支持的操作
  2. Android最新组件RecyclerView,替代ListVie
  3. 详解Android中Handler的内部实现原理
  4. 认识Android MVP
  5. "lianren"项目解析(一)
  6. Android ProgressBar自定义图片进度,自定
  7. 分享两个 Android 开源项目和一个 Doc
  8. Android 自定义控件入门篇之自定义验证码
  9. Android(安卓)小球重力感应实现
  10. Android View Touch的事件分发机制