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
private WheelView newDays; private ArrayList
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
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"/>
+ (_OF_MONTH) + "⽇"
+ OfWeekCN((_OF_WEEK)); //选择时间与当前时间的初始化,⽤于判断⽤户选择的是否是以前的时间,如果是,弹出toss提⽰不能选择过去的时间 selectDay = currentDay = (_OF_MONTH); selectMinute = currentMinute = (); selectHour = currentHour = (_OF_DAY); selectTime = currentHour + "点" + ((currentMinute < 10)?("0"+currentMinute):currentMinute) + "分"; dp_test = (DatePicker)ewById(_test); tp_test = (TimePicker)ewById(_test); tv_ok = (TextView) ewById(_ok); tv_cancel = (TextView) ewById(_cancel); //设置滑动改变监听器 dp_hangeListener(dp_onchanghelistener); tp_hangeListener(tp_onchanghelistener); pw = new PopupWindow(view, _CONTENT, _CONTENT, true);// //设置这2个使得点击pop以外区域可以去除pop// sideTouchable(true);// kgroundDrawable(new BitmapDrawable()); //出现在布局底端 Location(Rl_all, 0, 0, ); //点击确定 tv_lickListener(new OnClickListener() { @Override public void onClick(View arg0) { if(selectDay == currentDay ){ //在当前⽇期情况下可能出现选中过去时间的情况 if(selectHour < currentHour){ xt(getApplicationContext(), "不能选择过去的时间n 请重新选择", 0).show(); }else if( (selectHour == currentHour) && (selectMinute < currentMinute) ){ xt(getApplicationContext(), "不能选择过去的时间n 请重新选择", 0).show(); }else{ xt(getApplicationContext(), selectDate+selectTime, 0).show(); s(); } }else{ xt(getApplicationContext(), selectDate+selectTime, 0).show(); s(); } } }); //点击取消 tv_lickListener(new OnClickListener() { @Override public void onClick(View arg0) { s(); } }); } }); } //listeners geListener dp_onchanghelistener = new geListener() { @Override public void onChange(int year, int month, int day, int day_of_week) { selectDay = day; selectDate = year + "年" + month + "⽉" + day + "⽇" + OfWeekCN(day_of_week); } }; geListener tp_onchanghelistener = new geListener() { @Override public void onChange(int hour, int minute) { selectTime = hour + "点" + ((minute < 10)?("0"+minute):minute) + "分"; selectHour = hour; selectMinute = minute; } };}最终效果图:源码下载:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689427968a246512.html
评论列表(0条)