文末提供源码下载地址!!!
效果见图:
对于gif的录制,采用的是LICEcap软件,mac,windows都可以。
对于这个选择器,主要的几个功能的实现:
1. 时间的处理
主要用的是Calendar类,可以方便的对日期进行加减。
获取实例:
_currentCalendar = Calendar.getInstance();
计算日期的加减发:
_currentCalendar.add(Calendar.YEAR,+1);
_currentCalendar.add(Calendar.MONTH,-1);
时间的显示:
每一个方框中都是一个TextView,分别获取年,月,日,时,分设置在TextView上,获取时间的方法:
calendar.get(Calendar.YEAR)//获取年份
需要注意的是月份在获取的时候是少一个月的,比如现在是10月,当调用
calendar.get(Calendar.MONTH)
的时候返回的是9.
2.时间的显示格式,12H和24H
因为本例中需要处理12H格式和24H格式,文中采用的是:
DateFormat.is24HourFormat(getDialog().getContext())
通过调用这个方法,得到系统中用户设定默认的时间格式。返回true即为24小时格式。
当用户在时间选择器上选择12H时,用以下方法来保证小时部分显示正确:
int h = (calendar.get(Calendar.HOUR_OF_DAY)+12)%12; if(h==0){ h = 12; }
简单粗暴。
3.dialog在界面上显示的大小
开发中经常碰到dilog不能理想的显示的问题,本例中自定义了一个DialogFragment,在Dialog的onStart方法中调用以下代码,可以设置dialog相对于界面的大小比例:
public void onStart() { super.onStart(); DisplayMetrics dm = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm); //设置dialog在界面上所在宽高占比0.75 0.5 getDialog().getWindow().setLayout((int) (dm.widthPixels * 0.75), (int) (dm.widthPixels * 0.5)); }
文中设置宽度为全屏的3/4,高度为全屏的1/2。
最后说下大体思路:
主Activity的布局文件中只有一个按钮,用来出发Dialog。自定义了一个DataPickerDialog,继承自DialogFragment,它有一个监听,在DataPickerDialog中定义了一个接口,用来处理弹框中的确定和取消事件。onSure方法中可以得到当前时间(用Calendar承载的)和当前值的时间格式,String类型,在DataPickerDialog中有定义。
DataPickerDialog.java中主要设置一些按钮的监听。确认取消键提供接口共外部使用。这个Dialog布局的的中间一些调节时间的上下按键设置响应事件。如果一个一个find的话太麻烦了,其实六个是一样的,可以再封装一次。于是自定义一个DataPickerItemView。另外,这个文件中对时间进行统一处理:
@Override
public void onItemUpPress(View v) {
switch (v.getId()){
case R.id.data_picker_item_year:
_currentCalendar.add(Calendar.YEAR,+1);
break;
case R.id.data_picker_item_month:
_currentCalendar.add(Calendar.MONTH,+1);
break;
case R.id.data_picker_item_day:
_currentCalendar.add(Calendar.DAY_OF_MONTH,+1);
break;
case R.id.data_picker_item_hour:
_currentCalendar.add(Calendar.HOUR_OF_DAY,+1);
break;
case R.id.data_picker_item_min:
_currentCalendar.add(Calendar.MINUTE,+1);
break;
case R.id.data_picker_item_format:
switchFormat();
break;
default:
}
setCurrentDate(_currentCalendar,_currentFormat);
}
@Override
public void onItemBottomPress(View v) {
switch (v.getId()){
case R.id.data_picker_item_year:
_currentCalendar.add(Calendar.YEAR,-1);
break;
case R.id.data_picker_item_month:
_currentCalendar.add(Calendar.MONTH,-1);
break;
case R.id.data_picker_item_day:
_currentCalendar.add(Calendar.DAY_OF_MONTH,-1);
break;
case R.id.data_picker_item_hour:
_currentCalendar.add(Calendar.HOUR_OF_DAY,-1);
break;
case R.id.data_picker_item_min:
_currentCalendar.add(Calendar.MINUTE,-1);
break;
case R.id.data_picker_item_format:
switchFormat();
break;
default:
}
setCurrentDate(_currentCalendar,_currentFormat);
}
DataPickerItemView.java有三个控件两个ImageButton,一个TextView,提供方法setText(Object number)来设置需要显示的数字。在组件中提供上下两个ImageButton点击事件的接口,传出参数为DataPickerItemView这个View,以方便在DataPickerDialog.java中集中处理时间的变化。
最后的最后,上源码:http://git.oschina.net/164587694/MyDatePicker
本文地址:https://my.oschina.net/reone/blog/759774
来源:oschina
链接:https://my.oschina.net/u/2523371/blog/759774