Android基础:Date & Time组件(下)
2016-11-05 16:08
337 查看
本节引言
今天主要是DatePicker(日期选择器)、TimePicker(时间选择器) CalendarView(日历) DatePickerDilaog(日期选择Dialog) TimePickerDialog(时间选择Dialog),在4.x和5.x是显示不同的,4.x:Mode默认是spinner,5.x:Mode默认是Calendar。DatePicker、
TimePicker、
CalendarView都是View,直接在xml中声明控件;
DataPickerDialog、
TimePickerDialog继承自dialog;
DatePickerDilaogFragment、
TimePickerDialogFragment是自定义的类,分别继承自DialogFragment
DatePicker
效果图
4.x 5.xXML
<DatePicker android:id="@+id/dataPicker" android:layout_width="match_parent" android:layout_height="wrap_content" android:datePickerMode="spinner" />
代码
private void initDatePicker() { Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DAY_OF_MONTH); datePicker = (DatePicker) findViewById(R.id.dataPicker); //获取变化的值,若设置为0,那么现实的是1900年1月 datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() { @Override public void onDateChanged(DatePicker datePicker, int year, int month, int day) { ToastUtil.showShortToast(context, "您选择的日期是:" + year + "年" + (month + 1) + "月" + day + "日"); } }); }
TimePicker
效果图
4.x 5.xTimePicker
<TimePicker android:id="@+id/timePicker" android:layout_width="match_parent" android:layout_height="wrap_content"/>
代码
private void initTimePicker() { timePicker = (TimePicker) findViewById(R.id.timePicker); timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker timePicker, int hour, int minute) { ToastUtil.showShortToast(context, "您选择的时间是:" + hour + "时" + minute + "分"); } }); }
CalendarView
效果图
4.x 5.x代码
calendarView = (CalendarView) findViewById(R.id.calendarView); calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { @Override public void onSelectedDayChange(CalendarView calendarView, int year, int month, int day) { ToastUtil.showShortToast(context, "您选择的日期是:" + year + "年" + (month + 1) + "月" + day + "日"); } });
DatePickerDilaogFragment
效果图
4.x 5.x代码
public class DatePickerFragment extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DAY_OF_MONTH); DatePickerDialog dialog = new DatePickerDialog(getActivity(), listener, year, month, day); return dialog; } private DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker datePicker, int year, int month, int day) { ToastUtil.showShortToast(getActivity(), "您选择的日期是:" + year + "年" + (month + 1) + "月" + day + "日"); } }; }
在activity中显示这个fragment
TimePickerFragment fragment = new TimePickerFragment(); fragment.show(getSupportFragmentManager(), "TimePickerFragment");
TimePickerDialogFragment
效果图
4.x 5.x代码
public class TimePickerFragment extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Calendar calendar = Calendar.getInstance(); int hour = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); TimePickerDialog dialog = new TimePickerDialog(getActivity(), null, hour, minute, false); return dialog; } private TimePickerDialog.OnTimeSetListener listener = new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker timePicker, int hour, int minute) { ToastUtil.showShortToast(getActivity(), "您选择的时间是:" + hour + "时" + minute + "分"); } }; }
在activity中显示这个fragment
DatePickerFragment fragment = new DatePickerFragment(); fragment.show(getSupportFragmentManager(), "DatePickerFragment");
DatePickerDialog
**注意:**DatePickerDialog和TimePickerDialog 都有方法setButton(...),当我们重写该方法后,那么监听
OnDateSetListener、
OnTimeSetListener就无效了,不会走这2个监听,下面在重写
setButton()中会有说明
DatePickerDialog 不重写setButton()
效果图
代码
Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); DatePickerDialog datePickerDialog = new DatePickerDialog(context, onDateSetListener, year, month, dayOfMonth); datePickerDialog.setCanceledOnTouchOutside(false); datePickerDialog.setCancelable(false); datePickerDialog.show();
DatePickerDialog 重写setButton()
重写setButton(), 通过
getDatePicker()获取到
DatePicker对象,进而获取到year+month+day,所以不需要
OnDateSetListener
注意:
TimePickDialog确没有相似的方法
getTimePicker(),所以需要
OnTimeSetListener
效果图
代码
Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DAY_OF_MONTH); MyOnDateSetListener onDateSetListener = new MyOnDateSetListener(); //可以不传参数OnDateSetListener, 第2个参数: int themeResId, 第三个参数:OnDateSetListener final DatePickerDialog dialog = new DatePickerDialog(context, 0, null, year, month, day); dialog.setButton("自定义Button:确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog2, int which) { DatePicker datePicker = dialog.getDatePicker(); int year = datePicker.getYear(); int month = datePicker.getMonth() + 1; int dayOfMonth = datePicker.getDayOfMonth(); Log.d(TAG, "日期:" + year + "年" + month + "月" + dayOfMonth + "日"); } }); dialog.setButton2("自定义Button:取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Log.d(TAG, "取消" + ",which=" + which); } }); dialog.setCanceledOnTouchOutside(false); dialog.setCancelable(false); dialog.show();
TimePickerDialog
TimePickDialog:不重写setButton()
效果图
代码
Calendar calendar = Calendar.getInstance(); int hour = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); MyOnTimeSetListener timeSetListener = new MyOnTimeSetListener(); TimePickerDialog dialog = new TimePickerDialog(context, timeSetListener, hour, minute, true); dialog.setCanceledOnTouchOutside(false); dialog.setCancelable(false); dialog.show();
TimePickDialog:重写setButton()
效果图
代码
DatePickerDialog通过方法
getDatePicker()获取
DatePicker对象,今儿获取year+month+day,但是
TimePickDialog没有方法
getTimePicker(),所以我们不能像DatePickerDialog那样获取hour+minute,那么该怎么做呢,就是修改
SetButton()的第二个参数,不传
OnClickListener,直接传入
TimePickDialog对象。
Calendar calendar = Calendar.getInstance(); int hour = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); MyOnTimeSetListener timeSetListener = new MyOnTimeSetListener(); TimePickerDialog dialog = new TimePickerDialog(context, timeSetListener, hour, minute, true); //有效方法,第2个参数不传OnClickListener,直接传入dialog本身 dialog.setButton("自定义Button:确定", dialog); dialog.setButton2("自定义Button:取消", dialog); dialog.setCanceledOnTouchOutside(false); dialog.setCancelable(false); dialog.show();
MyOnTimeSetListener:
private class MyOnTimeSetListener implements TimePickerDialog.OnTimeSetListener { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { Log.d(TAG, "时间:" + hourOfDay + "时" + minute + "分"); } }
NumberPicker
用来显示数字,也可以显示String,当前的item是可以编辑的,编辑后点击回车键就会调转到编辑的item,前提是原数组中有我们编辑的内容。效果图
介绍
布局:<NumberPicker android:id="@+id/numberPicker2" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
方法
方法 | 说明 |
---|---|
setValue(12) | 设置当前值 |
setMinValue(0) | 设置最小值 |
setMaxValue(23) | 设置最大值 |
setOnValueChangedListener(…) | 值的变化监听 |
setDisplayedValues (String[] displayedValues) | 显示数组 |
setOnScrollListener(…) | 滑动的监听 |
numberPicker = (NumberPicker) findViewById(R.id.numberPicker); numberPicker.setValue(12); numberPicker.setMinValue(0); numberPicker.setMaxValue(23); numberPicker.offsetTopAndBottom(5); // numberPicker.setEnabled(false);//不可滑动 numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { Log.d(TAG, "oldVal=" + oldVal + ",newVal=" + newVal ); } });
也可以显示String,用到的方法是
numberPicker2.setDisplayedValues(array);
Demo
http://git.oschina.net/AndroidUI/numberpicker01dialog设置按钮
DatePickerDialog dialog = new DatePickerDialog(...)
方法一:已过时
dialog.setButton("确定",dialog/listener); dialog.setButton2("取消",dialog/listener); dialog.setButton3("中立",dialog/listener);
方法二:已过时
dialog.setButton(DialogInterface.BUTTON1,"确定",dialog/listener); dialog.setButton(DialogInterface.BUTTON2,"取消",dialog/listener); dialog.setButton(DialogInterface.BUTTON3,"中立",dialog/listener);
方法三:未过时
dialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定",dialog/listener); dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", dialog/listener); dialog.setButton(DialogInterface.BUTTON_NEUTRAL, "中立", dialog/listener);
上面的都是dialog的方法,构造这模式builder也可以
builder.setPositiveButton("确定", listener) builder.setNegativeButton("取消",listener) builder.setNeutralButton("中立",listener)
其它
2-6的Demo:DateTimePicker02参考:Android基础入门教程——2.3.12 Date & Time组件(下)
7-8的Demo: http://git.oschina.net/AndroidUI/DatePickerDialogTimePickerDialog
参考:
Android编程之TimePickerDialog设置确定键导致OnTimeSetListener不响应问题
Android:Picker(DatePicker、TimerPicker、NumberPicker)
重写DatePickerDialog 解决OnDateSetListener只有完成,没有取消回调问题
本片介绍的都是系统原生的控件,但实际工作中我们需要的是”2016年10月1日10时10分10秒”这样的数据,这需要自定义控件,github上有很多library,TimePickerDialog,精确到分钟,可以自定义很多参数,界面也不错,就是高度不可设置,demo:第三方开源库:日期时间选择器(TimePickerDialog)
相关文章推荐
- Android基础:Date & Time组件(上)
- Android基础入门教程——2.3.12 Date & Time组件(下)
- Android开发总结笔记 Date&Time(时间日期相关组件) 1-1-16
- Android入门教程三十三之Date & Time组件(上)
- Android入门教程三十三之Date & Time组件(下)
- android四大组件基础介绍及打电话,发短信简单应用 &单元测试
- Date & Time组件(下)-TimePicker(时间选择器)
- Android笔记——date&time(日期时间选择对话框)
- UI控件之Date & Time组件(下)
- Date & Time组件(下)-CalendarView(日历视图)
- salesforce 零基础学习(十六)Validation Rules & Date/time
- 喝酒不骑马的Android自学日记(7)-ListView监听器&&Date/TimePicker介绍
- 四,android四大组件基础介绍及打电话,发短信简单应用 &单元测试
- 0828Android基础自定义Dialog+DatePickerDialog+TimePickerDialog+PopupWindow+Notification
- android中提示&对话框----ProgressDialog&DatePickerDialog &TimePickerDialog&PopupWindow
- android *** TimePickerDialog && DatePickerDialog
- android基础-Toast提示框、日历视图(CalendarView)组件、日期、时间选择器DatePicker和TimerPicker等
- DatePicker && TimePicker 【Android】
- Android系统架构、基础组件、工具下载、JVM&DVM&ART