更新:
通过为TimePicker控件增加属性,使其具有是否以当前时间为上限的属性设置。
1、在attrs.xml文件中增加:
<declare-styleable name="TimePicker"> <attr name="Timelimited" format="boolean"/> </declare-styleable>
2、在需要使用TimePicker控件的xml中设置:
xmlns:timePicker="http://schemas.android.com/apk/res-auto"并在控件处使用:
<com.xxx.pickerview.TimePicker android:id="@+id/datepicker_start" timePicker:Timelimited="true" android:layout_width="fill_parent" android:layout_height="wrap_content" />
这样我们就能在TimePicker的构造函数中获取该属性并根据其值做相应操作:
比如下面的 flag 就是我们上面设置的属性值;
public TimePicker(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TimePicker); boolean flag = a.getBoolean(R.styleable.TimePicker_Timelimited,false); LayoutInflater.from(context).inflate(R.layout.pickerview_time, this,true);//这是对上面两句的包装。 final View timepickerview = findViewById(R.id.timepicker); wheelTime = new WheelTime(timepickerview, TimePickerType.Type.YEAR_MONTH_DAY); if (!flag){ int endYear=a.getInt(R.styleable.TimePicker_endYear,2900); wheelTime.setEndYear(endYear); }
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
最近手上的项目要求弄一个包含两个日期选择控件的UI界面(即开始时间和结束时间)。
一、
一开始就想到使用自带的DatePicker控件。但是发现其UI很难调整到项目想要的效果。尤其是其与项目theme的关系,在xml中设置style也不好使。从Popwindow到AlertDialog都试过了,只有含单个DatePicker的DateAlertDialog还比较赏心悦目,却不满足项目需要。
于是决定用自定义DatePicker来实现。
通过一番波折,自己实现了大部分功能,但对日期的年月日的配合调整的不是很好。
无意间在网上发现了Pickerview这个开源项目。(地址:https://github.com/saiwu-bigkoo/Android-PickerView#demo-图片)其中的TimePickerView比较符合我的需求,就借来稍加改动,使用了起来。
二、
由于TimePickerView的不是传统意义上的控件,其使用方式比较固定,不方便。我稍加改动,创建了TimePicker控件。
该控件的功能是:提供年月日用于选择,可选范围是:1990年1月1日到当前时间。 通过getTime()可以获取用户选择的时间。
代码:
1、Timepicker.java
public class TimePicker extends LinearLayout { WheelTime wheelTime; private OnTimeSelectListener timeSelectListener; public TimePicker(Context context) { super(context); } public TimePicker(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.pickerview_time, this,true);//这是对上面两句的包装。 final View timepickerview = findViewById(R.id.timepicker); wheelTime = new WheelTime(timepickerview, TimePickerType.Type.YEAR_MONTH_DAY); //默认选中当前时间 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DAY_OF_MONTH); int hours = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); wheelTime.setPicker(year, month, day, hours, minute); this.setClickable(true); this.setFocusable(true); } public Date getTime(){ String time= wheelTime.getTime(); Log.d("TimePicker","--------------getTime "+time); SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); Date d=new Date(); try { d=dateFormat.parse(time); } catch (ParseException e) { e.printStackTrace(); } return d; } /** * 设置可以选择的时间范围 * 要在setTime之前调用才有效果 * @param startYear 开始年份 * @param endYear 结束年份 */ public void setRange(int startYear, int endYear) { wheelTime.setStartYear(startYear)