基于自定义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