Oh My AndroidAndroid 精华Android 干货

Android 自定义控件 之 DatePicker与Numbe

2016-04-25  本文已影响4381人  Ivor0057

前言

喔时间是一种很奇妙的东西,数字亦如是。
  在Android开发中,肯定会有一些需求是针对于选择器的处理,甚至会有一些Limit的处理需求,重复的复用、重写相关的Picker,然后在需求变化时再重写一个......这是一件很Disgusting的事情。于是,就自己想办法抽出一个公共的Util吧。

这里针对于DatePicker和NumberPicker结合了AlertDialog自定义了该控件,先看一下其继承结构:

  java.lang.Object    
    ↳ android.view.View   
    ↳ android.view.ViewGroup    
    ↳ android.widget.FrameLayout    
    ↳ android.widget.TimePicker/DatePicker/TimePicker

由上可知,都是继承自FrameLayout,会有一种层层覆盖的感觉。

自定义:DateTimePickDialogUtil

先来看看源码中给出的points:

  public interface OnDateChangedListener {    
        /**     
        * Called upon a date change.     
        *     
        * @param view The view associated with this listener.     
        * @param year The year that was set.     
        * @param monthOfYear The month that was set (0-11) for compatibility     
        * with {@link java.util.Calendar}.     
        * @param dayOfMonth The day of the month that was set.     
        */    
        void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth);
  }      

  public DatePicker(Context context) {
        this(context, null);
  }

  public DatePicker(Context context, AttributeSet attrs) {    
        this(context, attrs, R.attr.datePickerStyle);
  }

  public DatePicker(Context context, AttributeSet attrs, int defStyle) {    
        super(context, attrs, defStyle);
  }

由源码可知,调用DatePicker( )的构造方法传入的参数需要有Context的对象,可选的有关于属性和自定义样式的参数。需要注意的是其提供的回调方法:即选择时的每次滚动都会回调这个方法,这和NumberPicker一致。此外,由@param可知,其月份是0-11,所以我们在使用定义月份时需要+1;下面来看看具体的实现步骤:

这里可们就可以将parse后的Date型变量进行操作了,需要注意的是mInitDate.getTime( )之类的方法不建议直接处理,因为会有一些需要转换的问题,这里我们可以使用Calender进行操作:
Calendar calendar = Calendar.getInstance();
calendar.setTime(mInitDate); // set Calendar

自定义:NumberPickerUtil

同理,先来看看源码中给出的points:

  public interface OnValueChangeListener {
        void onValueChange(NumberPicker picker, int oldVal, int newVal);
  }

  public interface OnScrollListener {
        public void onScrollStateChange(NumberPicker view, int scrollState);
  }

  public NumberPicker(Context context) {    
        this(context, null);
  }

  public NumberPicker(Context context, AttributeSet attrs) {    
        this(context, attrs, R.attr.numberPickerStyle);
  }

  public NumberPicker(Context context, AttributeSet attrs, int defStyle) {    
        super(context, attrs, defStyle);
        // TODO......
  }

总体的实现方法与DatePickerDialogUtil大体一致,通过构造方法与回调接口的方式引入引出,有一个细节的地方可以注意一下,就是对最大最小值以及初始值的设置:

  this.mPicker.setMinValue(minValue);
  this.mPicker.setMaxValue(maxValue);
  // 此处有坑!setValue需在min和max之后!
  this.mPicker.setValue(initValue);

尾声

再来说两句......

上一篇 下一篇

猜你喜欢

热点阅读