博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android基础:Date & Time组件(下)
阅读量:4132 次
发布时间:2019-05-25

本文共 8766 字,大约阅读时间需要 29 分钟。

本节引言

今天主要是DatePicker(日期选择器)、TimePicker(时间选择器) CalendarView(日历) DatePickerDilaog(日期选择Dialog) TimePickerDialog(时间选择Dialog),在4.x和5.x是显示不同的,4.x:Mode默认是spinner,5.x:Mode默认是Calendar。

DatePickerTimePickerCalendarView 都是View,直接在xml中声明控件;DataPickerDialogTimePickerDialog继承自dialog;DatePickerDilaogFragmentTimePickerDialogFragment是自定义的类,分别继承自DialogFragment

这里写图片描述

DatePicker

效果图

4.x 5.x

这里写图片描述 这里写图片描述

XML

代码

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.x

这里写图片描述 这里写图片描述

TimePicker

代码

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(...),当我们重写该方法后,那么监听OnDateSetListenerOnTimeSetListener就无效了,不会走这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, 第三个参数:OnDateSetListenerfinal 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,前提是原数组中有我们编辑的内容。

效果图

这里写图片描述

介绍

布局:

方法

方法 说明
setValue(12) 设置当前值
setMinValue(0) 设置最小值
setMaxValue(23) 设置最大值
setOnValueChangedListener(…) 值的变化监听
setDisplayedValues (String[] displayedValues) 显示数组
setOnScrollListener(…) 滑动的监听

numberPicker可以显示数字,数字在最小值和最大值之间。

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

dialog设置按钮

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:

参考:

7-8的Demo:

参考:

本片介绍的都是系统原生的控件,但实际工作中我们需要的是”2016年10月1日10时10分10秒”这样的数据,这需要自定义控件,github上有很多library,,精确到分钟,可以自定义很多参数,界面也不错,就是高度不可设置,demo:

你可能感兴趣的文章
北京十大情人分手圣地
查看>>
Android自动关机代码
查看>>
Android中启动其他Activity并返回结果
查看>>
2009年33所高校被暂停或被限制招生
查看>>
GlassFish 部署及应用入门
查看>>
iWatch报错: Authorization request cancled
查看>>
iWatch报错: Authorizationsession time out
查看>>
X-code7 beta error: warning: Is a directory
查看>>
Error: An App ID with identifier "*****" is not avaliable. Please enter a different string.
查看>>
X-code beta 开发iWatch项目,运行没有错误,但是某些操作一点就崩,而且找不错误的原因场景一
查看>>
Xcode 报错: Extra argument in call
查看>>
iTunes Connect 上传APP报错: Communication error. please use diagnostic mode to check connectivity.
查看>>
#import <Cocoa/Cocoa.h> 报错 Lexical or Preprocessor Issue 'Cocoa/Cocoa.h' file not found
查看>>
`MQTTClient (~> 0.2.6)` required by `Podfile`
查看>>
X-Code 报错 ld: library not found for -lAFNetworking
查看>>
Bitcode
查看>>
If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
查看>>
3.5 YOLO9000: Better,Faster,Stronger(YOLO9000:更好,更快,更强)
查看>>
iOS菜鸟学习--如何避免两个按钮同时响应
查看>>
How to access the keys in dictionary in object-c
查看>>