天天看点

Android时间选择器和日期选择器的使用注意

本文就时间和日期选择器做一个简单的使用

时间选择器

一般设置时间我们都会选择TimePicker或者TimePickerDialog,因为TimePickerDialog直接就是对话框使用方便,所以很多初学的就会更多选择TimePickerDialog,不说他会有什么不想要的效果,先看看它的使用方法

new TimePickerDialog(MainActivity.this,
            new TimePickerDialog.OnTimeSetListener() {
                @Override
                public void onTimeSet(TimePicker view, int hour, int minute) {
                    //在此获取时间:hour和minute,然后执行修改(要root权限)
                }
            }, calendar.get(Calendar.HOUR_OF_DAY), 
                calendar.get(Calendar.MINUTE), true).show();
           

效果如下:

Android时间选择器和日期选择器的使用注意

我们不管效果,就单单讲它的功能,你选择了时间之后,不管是点击完成还是点击了周围使得这个对话框消失,时间都已经被修改了,也就是说记这个完成按钮形同虚设,为什么会有这样的效果呢?因为这个对话框消失的时候就会调用onTimeSet方法(不管是点完成还是周围)

这不是我们想要的效果,我们要的是点击完成修改时间,点击周围退出时不修改时间。

这时候我们可能会想到监听一下完成按钮的点击不就行了吗,好我们来试试看:

TimePickerDialog timePickerDialog = new TimePickerDialog(this,
                    new OnTimeSetListener() {
                        @Override
                        public void onTimeSet(TimePicker view, int hourOfDay,
                                int minute) {
                            //在此获取时间:hour和minute,然后执行修改(要root权限)
                        }
                    }, calendar.get(Calendar.HOUR_OF_DAY),
                    calendar.get(Calendar.MINUTE), false);

            timePickerDialog.setTitle(R.string.title);
            timePickerDialog.setButton(TimePickerDialog.BUTTON_POSITIVE,
                    getString(R.string.ok),
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    });
            timePickerDialog.show();
           

这下好了在onClick中拿不到时间了,想想是不是可以定义一个全局变量什么的,在onTimeSet中设置,然后在onClick中拿到进行时间设置,但是,,,,这里要说但是,你会发现先执行的onclick然后执行的onTimeSet(我看有些博客说重写了onclick会不响应onTimeSet,但我这里没有遇到这个情况,就按我自己的测试结果写吧),我一开始也说了对话框消失的时候会调用onTimeSet,所以这里会出现那种每次点击确定会设置成上次选择的时间 的bug,效果很不理想,想了想,每次对话框消失的时候会调用onTimeSet,然后在其他地方又拿不到时间(就是我们滑动之后的那个时间),果断的不能用TimePickerDialog 实现我想要的效果,没办法只能选择使用较为麻烦的TimePicker。

TimePicker是一个控件,像button一样使用,得在xml中进行布局,下面是使用的详细方法。

<!--?xml version=1.0 encoding=utf-8?-->
<linearlayout android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical" android:padding="10dip" xmlns:android="http://schemas.android.com/apk/res/android">

    <Timepicker android:id="@+id/date_picker" android:layout_gravity="center" android:layout_height="wrap_content" android:layout_margintop="5dip" android:layout_width="wrap_content">
    </Timepicker > 
 </linearlayout>
           
//自定义控件
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                View view = (LinearLayout) getLayoutInflater().inflate(R.layout.time_dialog, null);
                final TimePicker timePicker = (TimePicker) view.findViewById(R.id.time_picker);
                //初始化时间
                calendar.setTimeInMillis(System.currentTimeMillis());
                timePicker.setIs24HourView(true); 
                timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY)); 
                timePicker.setCurrentMinute(Calendar.MINUTE); 
                //设置time布局
                builder.setView(view);
                builder.setTitle("设置时间信息");
                builder.setPositiveButton("确  定", new DialogInterface.OnClickListener() { 
                        @Override
                        public void onClick(DialogInterface dialog, int which) { 
                            mHour = timePicker.getCurrentHour();
                            mMinute = timePicker.getCurrentMinute();

                            dialog.cancel(); 
                        } 
                }); 

                builder.create().show();
           

这样就实现了我们想要的效果。

日期选择器

日期选择器的实现使用DatePicker和DatePickerDialog,其他的可以参考上面的时间选择器,基本都是一样的,这里不再过多的介绍。