美文网首页UI
自定义时间选择器

自定义时间选择器

作者: 若兮生生 | 来源:发表于2016-12-21 09:50 被阅读144次

    1.使用了NumberPickerView,github上找的一个控件。使用以下依赖就好。

    compile 'cn.carbswang.android:NumberPickerView:1.1.1'
    

    2.布局使用。

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
        <TextView
            android:id="@+id/time"
            android:text="时间选择"
            android:layout_centerHorizontal="true"
            android:gravity="center"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_weight="1" />
    
        <LinearLayout
            android:id="@+id/picker_ll"
            android:layout_below="@+id/time"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <cn.carbswang.android.numberpickerview.library.NumberPickerView
                android:layout_weight="1"
                android:id="@+id/picker_year"
                android:layout_width="wrap_content"
                android:layout_height="240dp"
                android:layout_centerHorizontal="true"
                android:background="#11333333"
                android:contentDescription="test_number_picker_view"
                app:npv_ItemPaddingHorizontal="5dp"
                app:npv_ItemPaddingVertical="5dp"
                app:npv_ShowCount="5"
                app:npv_RespondChangeOnDetached="false"
                app:npv_TextSizeNormal="16sp"
                app:npv_TextSizeSelected="20sp"
                app:npv_WrapSelectorWheel="true"/>
    
    
    
        <cn.carbswang.android.numberpickerview.library.NumberPickerView
                android:layout_weight="1"
                android:id="@+id/picker_month"
                android:layout_width="wrap_content"
                android:layout_height="240dp"
                android:layout_centerHorizontal="true"
                android:background="#11333333"
                android:contentDescription="test_number_picker_view"
                app:npv_ItemPaddingHorizontal="5dp"
                app:npv_ItemPaddingVertical="5dp"
                app:npv_ShowCount="5"
                app:npv_RespondChangeOnDetached="false"
                app:npv_TextSizeNormal="16sp"
                app:npv_TextSizeSelected="20sp"
                app:npv_WrapSelectorWheel="true"/>
            <cn.carbswang.android.numberpickerview.library.NumberPickerView
                android:layout_weight="1"
                android:id="@+id/picker_day"
                android:layout_width="wrap_content"
                android:layout_height="240dp"
                android:layout_centerHorizontal="true"
                android:background="#11333333"
                android:contentDescription="test_number_picker_view"
                app:npv_ItemPaddingHorizontal="5dp"
                app:npv_ItemPaddingVertical="5dp"
                app:npv_ShowCount="5"
                app:npv_RespondChangeOnDetached="false"
                app:npv_TextSizeNormal="16sp"
                app:npv_TextSizeSelected="20sp"
                app:npv_WrapSelectorWheel="true"/>
        </LinearLayout>
        <LinearLayout
            android:layout_below="@+id/picker_ll"
            android:layout_width="match_parent"
            android:layout_height="50dp">
            <Button
                android:id="@+id/cancle_time"
                android:background="@null"
                android:gravity="center"
                android:layout_weight="1"
                android:text="取消"
                android:layout_width="wrap_content"
                android:layout_height="match_parent" />
          <Button
                android:id="@+id/confirm_time"
                android:background="@null"
                android:gravity="center"
                android:layout_weight="1"
                android:text="确定"
                android:layout_width="wrap_content"
                android:layout_height="match_parent" />
        </LinearLayout>
    </RelativeLayout>
    

    布局效果如下:上面每个NumberPickerView代表一列。

    1_0.png

    2.代码里面引用

    (1)写一个类继承DialogFragment,重写onCreateView方法

    public class MyTimeDialog extends DialogFragment implements NumberPickerView.OnValueChangeListener {
        private static final String TAG = "MyTimeDialog";
        @BindView(R.id.picker_year)
        NumberPickerView pickerYear;
        @BindView(R.id.picker_month)
        NumberPickerView pickerMonth;
        @BindView(R.id.picker_day)
        NumberPickerView pickerDay;
        @BindView(R.id.cancle_time)
        Button cancleTime;
        @BindView(R.id.confirm_time)
        Button confirmTime;
    
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        getDialog().requestWindowFeature(STYLE_NO_TITLE);
        View view = inflater.inflate(R.layout.my_dialog_time, null);
    //使用注解,绑定控件
        ButterKnife.bind(this, view);
    
    //给每个设置改变监听
        pickerYear.setOnValueChangedListener(this);
    //设置展示的数据
        pickerYear.setDisplayedValues(getYear());
    //最大值,长度减1
        pickerYear.setMaxValue(getYear().length-1);
    //最小值,下标位0
        pickerYear.setMinValue(0);
    //设置默认出现的数值,这里都是数据的下标
        pickerYear.setValue(50);
    //年月日,依次类推。
        pickerMonth.setOnValueChangedListener(this);
        pickerMonth.setDisplayedValues(getMonth());
        pickerMonth.setMaxValue(getMonth().length-1);
        pickerMonth.setMinValue(0);
        pickerMonth.setValue(preferences.getInt(StaticParam.USER_INFO_MONTH,5));
    
        pickerDay.setOnValueChangedListener(this);
        pickerDay.setDisplayedValues(getDay31());
        pickerDay.setMaxValue(getDay31().length-1);
        pickerDay.setMinValue(0);
        pickerDay.setValue(preferences.getInt(StaticParam.USER_INFO_DAY,11));
    
        return view;
    }
    

    (2)由于,2月份有28天、29天、平时的月有30天,31天。下面设置了很多数据。

    public static String[] getYear() {
        String[] datas=new String[100];
        for (int i=1952;i<2052;i++){
            datas[i-1952]= String.valueOf(i);
        }
        return datas;
    
    }
    public static String[] getMonth() {
        String[] datas=new String[12];
        for (int i=1;i<13;i++){
            datas[i-1]= String.valueOf(i);
        }
        return datas;
    }
    
    public static String[] getDay31() {
        String[] datas=new String[31];
        for (int i=1;i<32;i++){
            datas[i-1]= String.valueOf(i);
        }
        return datas;
    }
    public static String[] getDay30() {
        String[] datas=new String[31];
        for (int i=1;i<31;i++){
            datas[i-1]= String.valueOf(i);
        }
        datas[30]="";
        return datas;
    }
    
    public static String[] getDay29() {
        String[] datas=new String[31];
        for (int i=1;i<30;i++){
            datas[i-1]= String.valueOf(i);
        }
        datas[29]="";
        datas[30]="";
        return datas;
    }
    public static String[] getDay28() {
        String[] datas=new String[31];
        for (int i=1;i<29;i++){
            datas[i-1]= String.valueOf(i);
        }
        datas[28]="";
        datas[29]="";
        datas[30]="";
        return datas;
    }
    

    (3)这个是监听回调

    @Override
    public void onValueChange(NumberPickerView picker, int oldVal, int newVal) {
        switch (picker.getId()){
            case R.id.picker_year:
                Log.e(TAG, "onValueChange: "+"newVal=="+newVal );
                this.newValYearIndex=newVal;
                break;
            case R.id.picker_month:
                Log.e(TAG, "onValueChange: "+"newVal=="+newVal );
    //如果是1、3、5、 7 、 8 、 10 、12,选择31天的数据
    if (this.newValMonthIndex==0||
            this.newValMonthIndex==2||
            this.newValMonthIndex==4||
            this.newValMonthIndex==6||
            this.newValMonthIndex==7||
            this.newValMonthIndex==9||
            this.newValMonthIndex==11
            ){
        pickerDay.setDisplayedValues(getDay31());
        pickerDay.setMaxValue(getDay31().length-1);
        pickerDay.setMinValue(0);
    //如果是4、 6 、 9 、11,选择是30天的数据
    }else if (this.newValMonthIndex==3||
            this.newValMonthIndex==5||
            this.newValMonthIndex==8||
            this.newValMonthIndex==10){
    
        pickerDay.setDisplayedValues(getDay30());
        pickerDay.setMaxValue(getDay30().length-1);
        pickerDay.setMinValue(0);
    //剩下的是2月份,如果是闰年,2月份数据时29天,如果不是,二月份数据是28天。这里判断闰年,不够准确,但在我的数据范围内没问题。
                }else if (this.newValMonthIndex==1){
                    if (this.newValYearIndex%4==0){
                        pickerDay.setDisplayedValues(getDay29());
                        pickerDay.setMaxValue(getDay29().length-1);
                        pickerDay.setMinValue(0);
                    }else {
                        pickerDay.setDisplayedValues(getDay28());
                        pickerDay.setMaxValue(getDay28().length-1);
                        pickerDay.setMinValue(0);
                    }
                }
                this.newValMonthIndex=newVal;
                break;
            case R.id.picker_day:
                Log.e(TAG, "onValueChange: "+"newVal=="+newVal );
    
                        this.newValDayIndex=newVal;
                break;
        }
    }
    

    (4)最后在点击确定时,拿到数据。

    @OnClick({R.id.cancle_time, R.id.confirm_time})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.cancle_time:
                getDialog().dismiss();
                break;
            case R.id.confirm_time:
              textView.setText(getYear()[newValYearIndex]+"/"+
                            getMonth()[newValMonthIndex]+"/"+
                             getDay31()[newValDayIndex]);
            getDialog().cancel();
            break;
    

    3.调用方式。

    public static void showTimeDialog(Activity context){
        MyTimeDialog myTimeDialog=new MyTimeDialog();
        myTimeDialog.show(context.getFragmentManager(),"myFragment");
    }
    

    4.总结
    使用NumberPickerView,是核心。
    在设置月份数据的时候,让他们长度都为31,不足31的设置为空,解决了,下标异常问题。

    相关文章

      网友评论

        本文标题:自定义时间选择器

        本文链接:https://www.haomeiwen.com/subject/ixxqvttx.html