基于自定义NumberPickerView时间选择器
来源:互联网 发布:js 计数器 滚动效果 编辑:程序博客网 时间:2024/06/01 13:27
这里我要记录一篇时间选择器的使用。
我用的是自定义控件NumberPickerView有疑问可以到这篇文章看看
NumberPickerView
首先说下布局吧我用的是三个NumberPickerView来做的
<viewpage.yundong.com.newpicker.NumberPickerView android:id="@+id/picker_years" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:contentDescription="picker_yeear" app:npv_HintText="年" app:npv_ItemPaddingHorizontal="5dp" app:npv_ItemPaddingVertical="5dp" app:npv_RespondChangeInMainThread="false" app:npv_ShowCount="3" app:npv_TextArray="@array/years_display" app:npv_TextSizeNormal="16sp" app:npv_TextSizeSelected="20sp" app:npv_WrapSelectorWheel="true"/> <viewpage.yundong.com.newpicker.NumberPickerView android:id="@+id/picker_month" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:contentDescription="picker_month" app:npv_HintText="月" app:npv_ItemPaddingHorizontal="5dp" app:npv_ItemPaddingVertical="5dp" app:npv_ShowCount="3" app:npv_TextArray="@array/month_display" app:npv_TextSizeNormal="16sp" app:npv_TextSizeSelected="20sp" app:npv_WrapSelectorWheel="true"/> <viewpage.yundong.com.newpicker.NumberPickerView android:id="@+id/picker_day" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" app:npv_HintText="日" android:contentDescription="picker_day" app:npv_ItemPaddingHorizontal="5dp" app:npv_ItemPaddingVertical="5dp" app:npv_ShowCount="3" app:npv_TextArray="@array/day_display" app:npv_TextSizeNormal="16sp" app:npv_TextSizeSelected="20sp" app:npv_WrapSelectorWheel="true"/> </LinearLayout>
然后说下,要解决的问题就是年和月份改变的时候处理天数问题
下面我先给出的我工具类(封装的很少,先实现以后慢慢改)
package viewpage.yundong.com.newpicker;import android.content.Context;import java.util.Calendar;/** * 时间的选择器帮助类 * Created by Administrator on 2017/2/28. */public class TimePickerUrl { private Context context; public TimePickerUrl(Context context){ this.context=context; } /** * 设置最大最小及其当前位置 * @param picker * @param minValue * @param maxValue * @param value */ public void setData(NumberPickerView picker, int minValue, int maxValue, int value){ picker.setMinValue(minValue); picker.setMaxValue(maxValue); picker.setValue(value); } /** * 获得当前月份多少天 * @param year * @param month * @return */ public int getNewDay(int year,int month){ Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR,year); cal.set(Calendar.MONTH, month - 1);//Java月份才0开始算 int dateOfMonth = cal.getActualMaximum(Calendar.DATE); return dateOfMonth; } /** * 改变天数的数据源并返回 * @param picker_day * @param year * @param month * @return */ public String[] changeDay(NumberPickerView picker_day,int year,int month){ String strDay[] = new String[0]; switch (getNewDay(year,month)){ case 31: strDay=context.getResources().getStringArray(R.array.day_display); break; case 30: strDay=context.getResources().getStringArray(R.array.day_display30); break; case 29: strDay=context.getResources().getStringArray(R.array.day_display29); break; case 28: strDay=context.getResources().getStringArray(R.array.day_display28); break; } if (getNewDay(year,month)!=picker_day.getRawContentSize()){ picker_day.refreshByNewDisplayedValues(strDay); } return strDay; } /*** * 获得当前应显示的位置 * @param str * @param strs * @return */ public int getWeiZhi(String str,String[]strs){ for (int i = 0; i <strs.length ; i++) { if (str.equals(strs[i])){ return i; } } return 0; }}
这里封装了需要的方法,包括刚刚提到的问题,那么接下来我们就要解决其他的问题了 给出测试代码
package viewpage.yundong.com.newpicker;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import java.util.Calendar;import java.util.Date;import java.util.Locale;public class Main2Activity extends AppCompatActivity { private int year; private int month; private int day; private NumberPickerView picker_years; private NumberPickerView picker_month; private NumberPickerView picker_day; private String[] yearStr; private String[] monthStr; private String[] dayStr; private TimePickerUrl timePickerUrl; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); timePickerUrl=new TimePickerUrl(this); final Calendar mycalendar = Calendar.getInstance(Locale.CHINA); Date mydate = new Date(); mycalendar.setTime(mydate); year = mycalendar.get(Calendar.YEAR); // 获取Calendar对象中的年 month = mycalendar.get(Calendar.MONTH) + 1;// 获取Calendar对象中的月 day = mycalendar.get(Calendar.DAY_OF_MONTH);// 获取这个月的第几天 picker_years = (NumberPickerView) findViewById(R.id.picker_years); picker_month = (NumberPickerView) findViewById(R.id.picker_month); picker_day = (NumberPickerView) findViewById(R.id.picker_day); yearStr = getResources().getStringArray(R.array.years_display); monthStr = getResources().getStringArray(R.array.month_display); timePickerUrl.setData(picker_years, 0, yearStr.length - 1, timePickerUrl.getWeiZhi(year + "", yearStr)); timePickerUrl.setData(picker_month, 0, monthStr.length - 1, timePickerUrl.getWeiZhi(month + "", monthStr)); dayStr= timePickerUrl. changeDay(picker_day,year,month); timePickerUrl.setData(picker_day, 0, dayStr.length - 1, timePickerUrl.getWeiZhi(day + "", dayStr)); //监听滚动 因为你前面的年月滚动会影响后面天数 picker_years.setOnValueChangedListener(new NumberPickerView.OnValueChangeListener() { @Override public void onValueChange(NumberPickerView picker, int oldVal, int newVal) { year = Integer.parseInt(yearStr[newVal]); Log.e("年", oldVal + "+==" + newVal + "=====" + yearStr[newVal]); Log.e(year + "-" + month + "多少天", timePickerUrl.getNewDay(year, month) + ""); timePickerUrl. changeDay(picker_day,year,month); } }); picker_month.setOnValueChangedListener(new NumberPickerView.OnValueChangeListener() { @Override public void onValueChange(NumberPickerView picker, int oldVal, int newVal) { month = Integer.parseInt(monthStr[newVal]); Log.e("月", oldVal + "+==" + newVal + "=====" + monthStr[newVal]); Log.e(year + "-" + month + "多少天", timePickerUrl.getNewDay(year, month) + "====" + picker_day.getOneRecycleSize() + "==" + picker_day.getRawContentSize()); timePickerUrl. changeDay(picker_day,year,month); } }); }}
这个也给你们吧
<?xml version="1.0" encoding="utf-8"?><resources> <string-array name="years_display"> <item>2014</item> <item>2015</item> <item>2016</item> <item>2017</item> <item>2018</item> <item>2019</item> <item>2020</item> <item>2021</item> <item>2022</item> </string-array> <string-array name="month_display"> <item>1</item> <item>2</item> <item>3</item> <item>4</item> <item>5</item> <item>6</item> <item>7</item> <item>8</item> <item>9</item> <item>10</item> <item>11</item> <item>12</item> </string-array> <string-array name="day_display"> <item>1</item> <item>2</item> <item>3</item> <item>4</item> <item>5</item> <item>6</item> <item>7</item> <item>8</item> <item>9</item> <item>10</item> <item>11</item> <item>12</item> <item>13</item> <item>14</item> <item>15</item> <item>16</item> <item>17</item> <item>18</item> <item>19</item> <item>20</item> <item>21</item> <item>22</item> <item>23</item> <item>24</item> <item>25</item> <item>26</item> <item>27</item> <item>28</item> <item>29</item> <item>30</item> <item>31</item> </string-array> <string-array name="day_display30"> <item>1</item> <item>2</item> <item>3</item> <item>4</item> <item>5</item> <item>6</item> <item>7</item> <item>8</item> <item>9</item> <item>10</item> <item>11</item> <item>12</item> <item>13</item> <item>14</item> <item>15</item> <item>16</item> <item>17</item> <item>18</item> <item>19</item> <item>20</item> <item>21</item> <item>22</item> <item>23</item> <item>24</item> <item>25</item> <item>26</item> <item>27</item> <item>28</item> <item>29</item> <item>30</item> </string-array> <string-array name="day_display29"> <item>1</item> <item>2</item> <item>3</item> <item>4</item> <item>5</item> <item>6</item> <item>7</item> <item>8</item> <item>9</item> <item>10</item> <item>11</item> <item>12</item> <item>13</item> <item>14</item> <item>15</item> <item>16</item> <item>17</item> <item>18</item> <item>19</item> <item>20</item> <item>21</item> <item>22</item> <item>23</item> <item>24</item> <item>25</item> <item>26</item> <item>27</item> <item>28</item> <item>29</item> </string-array> <string-array name="day_display28"> <item>1</item> <item>2</item> <item>3</item> <item>4</item> <item>5</item> <item>6</item> <item>7</item> <item>8</item> <item>9</item> <item>10</item> <item>11</item> <item>12</item> <item>13</item> <item>14</item> <item>15</item> <item>16</item> <item>17</item> <item>18</item> <item>19</item> <item>20</item> <item>21</item> <item>22</item> <item>23</item> <item>24</item> <item>25</item> <item>26</item> <item>27</item> <item>28</item> <item>29</item> </string-array></resources>
效果还可以
0 0
- 基于自定义NumberPickerView时间选择器
- 自定义日期时间选择器
- NumberPicker自定义时间选择器
- Android 自定义时间选择器
- 自定义时间选择器
- android自定义时间选择器
- Android自定义时间选择器
- 自定义时间选择器DatePicker
- 自定义时间选择器
- 自定义时间选择器
- 自定义时间选择器
- 自定义日期时间选择器
- Android自定义时间选择器
- 自定义时间选择器
- 自定义时间选择器RZDatePickerView
- 自定义时间选择器UIPickerView
- 一个自定义时间选择器
- 自定义时间选择器
- PAT 1109 Group Photo
- Python学习笔记(三)——Python数据结构之序列
- 【总结】JDK、java环境配置
- greedao 详细说明
- DP HDU-1069
- 基于自定义NumberPickerView时间选择器
- JS中Null与Undefined的区别
- 判断B数组中的所有元素是否都在A数组中
- 如何写好 Git commit messages
- 动态库的编译和链接(linux)
- Codevs 4927 线段树练习5(分块)
- VPN
- Qt和redis接口-hiredis
- 数据库性能优化主要包括哪些方面?