300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Android日期对话框NumberPicker的用法教程

Android日期对话框NumberPicker的用法教程

时间:2022-05-04 08:38:40

相关推荐

Android日期对话框NumberPicker的用法教程

独角兽企业重金招聘Python工程师标准>>>

NumberPicker是Android3.0之后引入的一个控件,NumberPicker 是用于选择一组预定义好数字的控件。比如时间hour的选择只有0—23有效,则可以通过setMinValue和setMaxValue设定。

使用该控件时需注意他的两个listener和一个formatter:一个listener用于监听当前value的变化;一个listener用于监听该控件的scroll状态;formatter用于格式化显示该控件中的value。下面逐一介绍这几个接口:

1、NumberPicker.OnValueChangeListener :其函数public void onValueChange(NumberPicker picker, int oldVal, int newVal) ;oldVal前一个选中的值,newValue当前选中的值。

2、NumberPicker.OnScrollListener:其内部有三种scroll状态SCROLL_STATE_FLING 、 SCROLL_STATE_IDLE 、 SCROLL_STATE_TOUCH_SCROLL。

SCROLL_STATE_TOUCH_SCROLL:用户按下去然后滑动。

SCROLL_STATE_FLING: 相当于是SCROLL_STATE_TOUCH_SCROLL的后续滑动操作。

SCROLL_STATE_IDLE: NumberPicker不在滚动。

3、NumberPicker.Formatter: 格式化显示数字,例如0—23格式化为00 — 23 。具体的格式在format函数中规定,如下所示:

publicStringformat(intvalue){StringStr=String.valueOf(value);if(value<10){Str="0"+Str;}returnStr;}

value值在0—23之间,小于10的数在前面加上“0”。

介绍完NumberPicker后,就要实现我们今天的功能,首先先看效果图,如下所示:

是不是非常漂亮那,这样以后我们的项目中需要这种效果,就直接就可以拿来用了。要实现这种效果当然要先看我们的布局了,其实布局里面就三个NumberPicker如下所示:

就是这三个NumberPicker布局出我们刚才的效果,布局完成我们就要找到这些控件,给他们加上监听,来实现一些功能,这里面是自定义FrameLayout在直接填充布局做的。让我们来看看,如下所示:

packagecom.zqy.datetimepicker.datedialog;importjava.util.Calendar;importcom.zqy.datetimepicker.R;importandroid.content.Context;importandroid.text.format.DateFormat;importandroid.widget.FrameLayout;importandroid.widget.NumberPicker;importandroid.widget.NumberPicker.OnValueChangeListener;publicclassDateTimePickerextendsFrameLayout{privatefinalNumberPickermDateSpinner;privatefinalNumberPickermHourSpinner;privatefinalNumberPickermMinuteSpinner;privateCalendarmDate;privateintmHour,mMinute;privateString[]mDateDisplayValues=newString[7];privateOnDateTimeChangedListenermOnDateTimeChangedListener;publicDateTimePicker(Contextcontext){super(context);/**獲取系統時間*/mDate=Calendar.getInstance();mHour=mDate.get(Calendar.HOUR_OF_DAY);mMinute=mDate.get(Calendar.MINUTE);/***加载布局*/inflate(context,R.layout.datedialog,this);/***初始化控件*/mDateSpinner=(NumberPicker)this.findViewById(R.id.np_date);mDateSpinner.setMinValue(0);mDateSpinner.setMaxValue(6);updateDateControl();mDateSpinner.setOnValueChangedListener(mOnDateChangedListener);mHourSpinner=(NumberPicker)this.findViewById(R.id.np_hour);mHourSpinner.setMaxValue(23);mHourSpinner.setMinValue(0);mHourSpinner.setValue(mHour);mHourSpinner.setOnValueChangedListener(mOnHourChangedListener);mMinuteSpinner=(NumberPicker)this.findViewById(R.id.np_minute);mMinuteSpinner.setMaxValue(59);mMinuteSpinner.setMinValue(0);mMinuteSpinner.setValue(mMinute);mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener);}/****控件监听器*/privateNumberPicker.OnValueChangeListenermOnDateChangedListener=newOnValueChangeListener(){@OverridepublicvoidonValueChange(NumberPickerpicker,intoldVal,intnewVal){mDate.add(Calendar.DAY_OF_MONTH,newVal-oldVal);/***更新日期*/updateDateControl();/***给接口传值*/onDateTimeChanged();}};privateNumberPicker.OnValueChangeListenermOnHourChangedListener=newOnValueChangeListener(){@OverridepublicvoidonValueChange(NumberPickerpicker,intoldVal,intnewVal){mHour=mHourSpinner.getValue();onDateTimeChanged();}};privateNumberPicker.OnValueChangeListenermOnMinuteChangedListener=newOnValueChangeListener(){@OverridepublicvoidonValueChange(NumberPickerpicker,intoldVal,intnewVal){mMinute=mMinuteSpinner.getValue();onDateTimeChanged();}};privatevoidupdateDateControl(){/***星期几算法*/Calendarcal=Calendar.getInstance();cal.setTimeInMillis(mDate.getTimeInMillis());cal.add(Calendar.DAY_OF_YEAR,-7/2-1);mDateSpinner.setDisplayedValues(null);for(inti=0;i<7;++i){cal.add(Calendar.DAY_OF_YEAR,1);mDateDisplayValues[i]=(String)DateFormat.format("MM.ddEEEE",cal);}mDateSpinner.setDisplayedValues(mDateDisplayValues);mDateSpinner.setValue(7/2);mDateSpinner.invalidate();}/**接口回调参数是当前的View年月日小时分钟*/publicinterfaceOnDateTimeChangedListener{voidonDateTimeChanged(DateTimePickerview,intyear,intmonth,intday,inthour,intminute);}/**对外的公开方法*/publicvoidsetOnDateTimeChangedListener(OnDateTimeChangedListenercallback){mOnDateTimeChangedListener=callback;}privatevoidonDateTimeChanged(){if(mOnDateTimeChangedListener!=null){mOnDateTimeChangedListener.onDateTimeChanged(this,mDate.get(Calendar.YEAR),mDate.get(Calendar.MONTH),mDate.get(Calendar.DAY_OF_MONTH),mHour,mMinute);}}}

这段代码就是找到这三个控件,分别给他们setMinValue(),setMaxValue(),也就是最大值和最小值,设置完成后,我们给他们三个分别加上监听setOnValueChangedListener下面有三个监听方法,在mOnDateChangedListener这个方法了多了一个updateDateControl()方法,这个updateDateControl()方法里面主要是月份和星期几的关系算法,

写完这些,值也拿到了,但是我们需要把值传出去,下面我们又定义了一个接口来实现回调.接下来让我们在来看看对话框这个类,如下所示:

packagecom.zqy.datetimepicker.datedialog;importjava.util.Calendar;importcom.zqy.datetimepicker.datedialog.DateTimePicker.OnDateTimeChangedListener;importandroid.app.AlertDialog;importandroid.content.Context;importandroid.content.DialogInterface;importandroid.content.DialogInterface.OnClickListener;importandroid.text.format.DateUtils;publicclassDateTimePickerDialogextendsAlertDialogimplementsOnClickListener{privateDateTimePickermDateTimePicker;privateCalendarmDate=Calendar.getInstance();privateOnDateTimeSetListenermOnDateTimeSetListener;@SuppressWarnings("deprecation")publicDateTimePickerDialog(Contextcontext,longdate){super(context);mDateTimePicker=newDateTimePicker(context);setView(mDateTimePicker);/**实现接口,实现里面的方法*/mDateTimePicker.setOnDateTimeChangedListener(newOnDateTimeChangedListener(){@OverridepublicvoidonDateTimeChanged(DateTimePickerview,intyear,intmonth,intday,inthour,intminute){mDate.set(Calendar.YEAR,year);mDate.set(Calendar.MONTH,month);mDate.set(Calendar.DAY_OF_MONTH,day);mDate.set(Calendar.HOUR_OF_DAY,hour);mDate.set(Calendar.MINUTE,minute);mDate.set(Calendar.SECOND,0);/***更新日期*/updateTitle(mDate.getTimeInMillis());}});setButton("设置",this);setButton2("取消",(OnClickListener)null);mDate.setTimeInMillis(date);updateTitle(mDate.getTimeInMillis());}/**接口回調*控件秒数*/publicinterfaceOnDateTimeSetListener{voidOnDateTimeSet(AlertDialogdialog,longdate);}/***更新对话框日期*@paramdate*/privatevoidupdateTitle(longdate){intflag=DateUtils.FORMAT_SHOW_YEAR|DateUtils.FORMAT_SHOW_DATE|DateUtils.FORMAT_SHOW_WEEKDAY|DateUtils.FORMAT_SHOW_TIME;setTitle(DateUtils.formatDateTime(this.getContext(),date,flag));}/**对外公开方法让Activity实现*/publicvoidsetOnDateTimeSetListener(OnDateTimeSetListenercallBack){mOnDateTimeSetListener=callBack;}publicvoidonClick(DialogInterfacearg0,intarg1){if(mOnDateTimeSetListener!=null){mOnDateTimeSetListener.OnDateTimeSet(this,mDate.getTimeInMillis());}}}

我们一行一行看,首先我们是继承AlertDialog,在下面我们new DateTimePicker,这个就是刚才写的类,我们这个类的对象实现我们刚才写的接口,把里面的值取到,虽然取到了,但是我们也不是在这里显示,所以我们还需要定义接口,让DateTimePickerDialog的对象去实现,下面就是我们的写的接口,我们写了那么多,只为MainActivity里面的几行代码,让我们看看,如下所示:

packagecom.zqy.datetimepicker.activity;importjava.text.SimpleDateFormat;importcom.zqy.datetimepicker.R;importcom.zqy.datetimepicker.datedialog.DateTimePickerDialog;importcom.zqy.datetimepicker.datedialog.DateTimePickerDialog.OnDateTimeSetListener;importandroid.app.Activity;importandroid.app.AlertDialog;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.Toast;publicclassMainActivityextendsActivity{privateButtonbtn;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);btn=(Button)this.findViewById(R.id.button1);btn.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){showDialog();}});}publicvoidshowDialog(){DateTimePickerDialogdialog=newDateTimePickerDialog(this,System.currentTimeMillis());/***实现接口*/dialog.setOnDateTimeSetListener(newOnDateTimeSetListener(){publicvoidOnDateTimeSet(AlertDialogdialog,longdate){Toast.makeText(MainActivity.this,"您输入的日期是:"+getStringDate(date),Toast.LENGTH_LONG).show();}});dialog.show();}/***将长时间格式字符串转换为时间yyyy-MM-ddHH:mm:ss**/publicstaticStringgetStringDate(Longdate){SimpleDateFormatformatter=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");StringdateString=formatter.format(date);returndateString;}}

首先我们还是new DateTimePickerDialog这个类,我们把系统时间传过去,这样时间对话框显示的就是系统时间了,我们用这个类的对象去实现我们刚才写的接口,实现里面的方法,我们又定义了一个 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss的方法,这样我用一个Toast把接口里面的值弹出来。OK,这样我们就实现完成了,有什么不明白的可以在下面留言。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。