您的位置:首页 > 移动开发 > Android开发

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





XML

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





TimePicker

<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 = (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/numberpicker01

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: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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: