5.1 日期时间控件

本节介绍Android的日期时间控件,主要是日期选择对话框DatePickerDialog和时间选择对话框TimePickerDialog的用法。

5.1.1 日期选择器DatePicker

虽然EditText控件提供inputType="date"的日期输入,但是很少有用户会老老实实地手工输入日期,况且EditText还不支持“****年**月**日”这样的日期格式,所以都要系统提供日期控件,供用户选择具体的年月日,在Android中这个控件是DatePicker。不过,DatePicker并非弹窗模式,而是直接在页面上占据一块区域,并且不会自动关闭。按习惯来说,日期控件应该在当前页面弹出,选择完日期就要把控件关掉。因此,DatePicker不适合直接使用,实际开发中用的是已经封装好的日期选择对话框DatePickerDialog。

DatePickerDialog相当于在AlertDialog上加载了DatePicker,用起来更简单,只需调用构造函数设置一下当前年、月、日,然后调用show方法即可弹出日期对话框。日期选择事件由监听器OnDateSetListener负责响应,在该监听器实现的onDateSet方法中,开发者能够获得用户选择的具体日期,并做后续处理。这里要特别注意onDateSet方法的月份参数,该参数的起始值不是1而是0。也就是说,一月份对应的参数数值是0,十二月份对应的参数数值是11。如果实在不理解,记住这里的月份值要加1就行了。

图5-1所示为一个默认样式的日期选择对话框。其中,年、月、日通过上下滑动选择。

图5-1 日期选择对话框

下面是使用日期对话框的代码:

        public class DatePickerActivity extends AppCompatActivity implements OnClickListener,
    OnDateSetListener {
            private TextView tv_date;


            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_date_picker);
                tv_date = (TextView) findViewById(R.id.tv_date);
                findViewById(R.id.btn_date).setOnClickListener(this);
            }


            @Override
            public void onClick(View v) {
                if (v.getId() == R.id.btn_date) {
                    Calendar calendar = Calendar.getInstance();
                    DatePickerDialog dialog = new DatePickerDialog(this, this,
                            calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                            calendar.get(Calendar.DAY_OF_MONTH));
                    dialog.show();
                }
            }


            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                String desc = String.format("您选择的日期是%d年%d月%d日",
                        year, monthOfYear+1, dayOfMonth);
                tv_date.setText(desc);
            }
        }

5.1.2 时间选择器TimePicker

有了日期选择器,肯定有对应的时间选择器。同样,实际开发中也不直接用TimePicker,而是用封装好的时间选择对话框TimePickerDialog。该对话框的用法类似DatePickerDialog,不同之处主要有两个:

(1)构造函数传的是当前的小时与分钟,最后一个参数表示是否采用二十四小时制,一般传true,表示小时的数值范围为0~23。

(2)时间选择监听器是OnTimeSetListener,对应需要实现的方法是onTimeSet,在该方法中可获得用户选好的小时和分钟。

图5-2所示为一个默认样式的时间选择对话框。其中,小时与分钟可通过上下滑动选择。

图5-2 时间选择对话框

下面是使用时间对话框的代码:

        public class TimePickerActivity extends AppCompatActivity implements OnClickListener,
    OnTimeSetListener {
            private TextView tv_time;


            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_time_picker);
                tv_time = (TextView) findViewById(R.id.tv_time);
                findViewById(R.id.btn_time).setOnClickListener(this);
            }


            @Override
            public void onClick(View v) {
                if (v.getId() == R.id.btn_time) {
                    Calendar calendar = Calendar.getInstance();
                    TimePickerDialog dialog = new TimePickerDialog(this, this,
                            calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE),
    true);
                    dialog.show();
                }
            }


            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                String desc = String.format("您选择的时间是%d时%d分", hourOfDay, minute);
                tv_time.setText(desc);
            }
        }