Android基于wheelView实现自定义日期选择器

Android基于wheelView实现自定义日期选择器

2023年7月15日发(作者:)

Android基于wheelView实现⾃定义⽇期选择器本⽂实例为⼤家分享了Android实现⾃定义⽇期选择器的具体代码,供⼤家参考,具体内容如下项⽬要求效果图:要求 “6⽉20 星期五” 这⼀项作为⼀个整体可以滑动,”7时”、”48分”分别作为⼀个滑动整体。系统⾃带的DatePicker、TimePicker⼤家都知道,只有这种效果:百度了很多,试了NumberPicker等都不⾏,本来打算⾃⼰写。⽹友推荐了⼀个开源组件WheelView,下下来试了试,发现他已经定义的很完善了,在他的基础上拓展很容易。现将基于wheelView⾃定义⽇期选择器记录如下:⼀.⾸先要了解WheelView为我们提供了什么:除了我写的”DateObject”与”StringWheelAdapter”,其余都是WheelView提供的,1. :可滚动的组件主要⽅法:setAdapter(new StringWheelAdapter(dateList, 7)); //设置Adapter

setVisibleItems(3); //设置显⽰⼏⾏数据

setCyclic(true); //设置是否循环显⽰数据

addChangingListener(onDaysChangedListener) //设置滑动监听器2. : 滑动组件的适配器的接⼝,⼦类适配器⽤于装载数据public interface WheelAdapter { /** * Gets items count * @return the count of wheel items */ public int getItemsCount(); /** * Gets a wheel item by index. *

* @param index the item index * @return the wheel item text or null */ public String getItem(int index); /** * Gets maximum item length. It is used to determine the wheel width.

* If -1 is returned there will be used the default wheel width. *

* @return the maximum item length or -1 */ public int getMaximumLength();}3. : 滑动监听器接⼝public interface OnWheelChangedListener { /** * Callback method to be invoked when current item changed * @param wheel the wheel view whose state has changed * @param oldValue the old value of current item * @param newValue the new value of current item */ void onChanged(WheelView wheel, int oldValue, int newValue);} :滚动监听器接⼝(暂时没⽤到) : 当滚动内容为纯数字时调⽤的适配器 : ⽇期实体类,⽤于存储、获取选择的数据package ;import ar;public class DateObject extends Object{ private int year ; private int month; private int day; private int week; private int hour; private int minute; private String listItem; /** * ⽇期对象的4个参数构造器,⽤于设置⽇期 * @param year * @param month * @param day * @author sxzhang */ public DateObject(int year2, int month2, int day2,int week2) { super(); = year2; int maxDayOfMonth = tance().getActualMaximum(_OF_MONTH); if(day2 > maxDayOfMonth){ = month2 + 1; = day2 % maxDayOfMonth; }else{ = month2; = day2; } = week2 % 7 == 0 ? 7 : week2 % 7; if(day == tance().get(_OF_MONTH)){ em = ("%02d", ) +"⽉" + ("%02d", ) +

"⽇ "+ " 今天 "; }else{ em = ("%02d", ) +"⽉" + ("%02d", ) +

"⽇ "+ getDayOfWeekCN(week); } } /** * ⽇期对象的2个参数构造器,⽤于设置时间 * @param hour2 * @param minute2 * @param isHourType true:传⼊的是hour; false: 传⼊的是minute * @author sxzhang */ public DateObject(int hour2,int minute2,boolean isHourType) { super(); if(isHourType == true && hour2 != -1){ //设置⼩时 if(hour2 > 24){ = hour2 % 24; }else = hour2; em = + "时"; }else if(isHourType == false && minute2 != -1){ //设置分钟 if(minute2 > 60) = minute2 % 60; else = minute2; em = + "分"; } } public int getHour() { return hour; } public void setHour(int hour) { = hour; } public int getMinute() { return minute; } public void setMinute(int minute) { = minute; } public int getWeek() { return week; } public void setWeek(int week) { = week; } public int getYear() { return year; } public void setYear(int year) { = year; } public int getMonth() { return month; } public void setMonth(int month) { = month; } public int getDay() { return day; } public void setDay(int day) { = day; } public String getListItem() { return listItem; } public void setListItem(String listItem) { em = listItem; } /** * 根据day_of_week得到汉字星期 * @return */ public static String getDayOfWeekCN(int day_of_week){ String result = null; switch(day_of_week){ case 1: result = "星期⽇"; break; case 2: result = "星期⼀"; break; case 3: result = "星期⼆"; break; case 4: result = "星期三"; break; case 5: result = "星期四"; break; case 6: result = "星期五"; break; case 7: result = "星期六"; break;

default: break; } return result; }} :⼀会⼉将定义的滚动内容为字符串的适配器,当内容为字符串时我们就可以随意拓展滑动部分的内容package ;import ist;/** * The simple String Array wheel adapter *

*/public class StringWheelAdapter implements WheelAdapter { /** The default items length */ public static final int DEFAULT_LENGTH = -1; // items private ArrayList list; // length private int length; /** * Constructor * @param items the items * @param length the max items length */ public StringWheelAdapter(ArrayList list, int length) { = list; = length; } @Override public String getItem(int index) { if (index >= 0 && index < ()) { return (index).getListItem(); } return null; } @Override public int getItemsCount() { return (); } @Override public int getMaximumLength() { return length; }}⼆.了解以后就可以使⽤他定义我们需要的了。1.⾸先要做的是这个效果的部分:我们将其命名为DatePicker:package ;import ist;import ar;import ject;import lChangedListener;import WheelAdapter;import iew;import t;import uteSet;import Layout;/** * ⾃定义的⽇期选择器 * @author sxzhang * */public class DatePicker extends LinearLayout { private Calendar calendar = tance();

private WheelView newDays; private ArrayList dateList ; private OnChangeListener onChangeListener; //onChangeListener private final int MARGIN_RIGHT = 20; private DateObject dateObject; //⽇期数据对象 //Constructors public DatePicker(Context context) { super(context); init(context); } public DatePicker(Context context, AttributeSet attrs) { super(context, attrs); init(context); } /** * 初始化 * @param context */ private void init(Context context){ int year = (); int month = () + 1; int day = (_OF_MONTH); int week = (_OF_WEEK); dateList = new ArrayList(); for (int i = 0; i < 7; i++) { dateObject = new DateObject(year, month, day+i, week+i); (dateObject); } newDays = new WheelView(context); LayoutParams newDays_param = new LayoutParams(300,_CONTENT); newDays_gins(0, 0, MARGIN_RIGHT, 0); outParams(newDays_param); pter(new StringWheelAdapter(dateList, 7)); ibleItems(3); lic(true); ngingListener(onDaysChangedListener);

addView(newDays); } /** * 滑动改变监听器 */ private OnWheelChangedListener onDaysChangedListener = new OnWheelChangedListener(){ @Override public void onChanged(WheelView mins, int oldValue, int newValue) { (_OF_MONTH, newValue + 1); change(); } }; /** * 滑动改变监听器回调的接⼝ */ public interface OnChangeListener { void onChange(int year, int month, int day, int day_of_week); } /** * 设置滑动改变监听器 * @param onChangeListener */ public void setOnChangeListener(OnChangeListener onChangeListener){ geListener = onChangeListener; } /** * 滑动最终调⽤的⽅法 */ private void change(){ if(onChangeListener!=null){ ge( (rentItem()).getYear(),

(rentItem()).getMonth(),

(rentItem()).getDay(),

(rentItem()).getWeek()); } } /** * 根据day_of_week得到汉字星期 * @return */ public static String getDayOfWeekCN(int day_of_week){ String result = null; switch(day_of_week){ case 1: result = "星期⽇"; break; case 2: result = "星期⼀"; break; case 3: result = "星期⼆"; break; case 4: result = "星期三"; break; case 5: result = "星期四"; break; case 6: result = "星期五"; break; case 7: result = "星期六"; break;

default: break; } return result; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { ure(widthMeasureSpec, heightMeasureSpec); }}2.然后要做的是这个效果的部分我们命名为TimePicker:package ;import ist;import ar;import ject;import lChangedListener;import WheelAdapter;import iew;import t;import uteSet;import Layout;/** * ⾃定义的时间选择器 * @author sxzhang * */public class TimePicker extends LinearLayout{ private Calendar calendar = tance();

private WheelView hours, mins; //Wheel picker private OnChangeListener onChangeListener; //onChangeListener private final int MARGIN_RIGHT = 15; //调整⽂字右端距离 private ArrayList hourList,minuteList; private DateObject dateObject; //时间数据对象 //Constructors public TimePicker(Context context) { super(context); init(context); } public TimePicker(Context context, AttributeSet attrs) { super(context, attrs); init(context); } /** * 初始化 * @param context */ private void init(Context context){ int hour = (_OF_DAY); int minute = (); hourList = new ArrayList(); minuteList = new ArrayList(); for (int i = 0; i < 24; i++) { dateObject = new DateObject(hour+i,-1,true); (dateObject); } for (int j = 0; j < 60; j++) { dateObject = new DateObject(-1,minute+j,false); (dateObject); } //⼩时选择器 hours = new WheelView(context); LayoutParams lparams_hours = new LayoutParams(80,_CONTENT); lparams_gins(0, 0, MARGIN_RIGHT, 0); outParams(lparams_hours); pter(new StringWheelAdapter(hourList, 24)); ibleItems(3); lic(true); ngingListener(onHoursChangedListener);

addView(hours);

//分钟选择器 mins = new WheelView(context); outParams(new LayoutParams(80,_CONTENT)); pter(new StringWheelAdapter(minuteList,60)); ibleItems(3); lic(true); ngingListener(onMinsChangedListener);

addView(mins);

}

//listeners private OnWheelChangedListener onHoursChangedListener = new OnWheelChangedListener(){ @Override public void onChanged(WheelView hours, int oldValue, int newValue) { (_OF_DAY, newValue); change(); } }; private OnWheelChangedListener onMinsChangedListener = new OnWheelChangedListener(){ @Override public void onChanged(WheelView mins, int oldValue, int newValue) { (, newValue); change(); } }; /** * 滑动改变监听器回调的接⼝ */ public interface OnChangeListener { void onChange(int hour, int munite); } /** * 设置滑动改变监听器 * @param onChangeListener */ public void setOnChangeListener(OnChangeListener onChangeListener){ geListener = onChangeListener; } /** * 滑动最终调⽤的⽅法 */ private void change(){ if(onChangeListener!=null){ ge(getHourOfDay(), getMinute()); } } /** * 获取⼩时 * @return */ public int getHourOfDay(){ return (rentItem()).getHour(); } /** * 获取分钟 * @return */ public int getMinute(){ return (rentItem()).getMinute(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { ure(widthMeasureSpec, heightMeasureSpec); }}3.最后就可以直接使⽤了,我这⾥主界⾯是⼀个button,点击后弹出popupWindow显⽰⽇期选择器。布局⽂件及主Activity如下:popupWindow布局⽂件:

android:background="#FFF">

android:layout_width="match_parent" android:layout_height="1dp" android:background="#f5f5f5"/>

android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="10dp">

android:layout_width="match_parent" android:layout_height="1dp" android:background="#f5f5f5"/>

android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="10dp" android:padding="20dp"> 主界⾯布局⽂件:

android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_alignParentBottom="true" android:padding="10dp" android:gravity="center">

android:layout_width="match_parent" android:layout_height="1dp" android:background="#f5f5f5"/>

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信