修改DatePicker、  NumberPicker 默认属性(间距、分割线颜色和高度)

1、基本使用

1、简单使用

   <DatePicker
        android:startYear="2017"
        android:endYear="2018"
        android:calendarViewShown="false"
        android:spinnersShown="true"
        android:datePickerMode="spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
  • calendarViewShown:是否显示ClendarView日历组件
  • spinnersShown:是否显示Spinner日期选择组件
  • datePickerMode:有两个值
  • calendar:日历形式的日期选择器
  • Spinner:滚动的
calendarViewShown="false",spinnersShown="true",使用日期组件
calendarViewShown="true",spinnersShown="true",使用日历和日期组件
使用日历组件

2、初始化datePicker

   private void initPicker() {
        //设置中文日历
        calendar = Calendar.getInstance(Locale.CHINA);
        int year=calendar.get(Calendar.YEAR);
        int month=calendar.get(Calendar.MONTH);
        int day=calendar.get(Calendar.DAY_OF_MONTH);
        int week=calendar.get(Calendar.DAY_OF_WEEK);

        //初始化datePicker
        datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() {
            @Override
            public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    
            }
        });

        //设置最大日期
        GregorianCalendar g=new GregorianCalendar(year,month,day+7);
        datePicker.setMaxDate(g.getTimeInMillis());

    } 

3、初始化numberPicker

    private void initPicker() {
        ...
        //设置numberPicker展示的值,一个数组
        numberPicker.setDisplayedValues(times);
        //numberPicker的最小值
        numberPicker.setMinValue(0);
        //numberPicker的最大值
        numberPicker.setMaxValue(length-1);
        //numberPicker当前值
        numberPicker.setValue(preId);
    
        numberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

    }

3、设置NumberPicker,中间的EditView不可以点击

中间不可点击修改
        datePicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS);

4、设置NumberPicker,不能循环

        numPicker.setWrapSelectorWheel(false);

numberpicker的循环滚动需要遍历所有元素,可能会导致的数组越界(当再次为numberpicker赋值时...)

2、获得DatePicker的三个NumberPicker

DatePicker中选择年月日的部分是三个NumberPicker,名字分别为mYearSpinner,mMonthSpinner、mDaySpinner,它们三个平铺在一个LinearLayout中,可以通过如下方法得到这些NumberPicker:

  • 利用java反射技术得到DatePicker内部的属性(三个NumberPicker),并对其进行操作(适用于API<21)
  • 可以通过三个NumberPicker的资源id,得到这些view(API>=21,这三个NumberPicker,不是DatePicker内部的属性)。或者根据view树的结构,得到NumberPicker
DatePicker
public class DatePicker extends FrameLayout {
    ...
    /**
     * A delegate implementing the basic DatePicker
     */
    private static class DatePickerSpinnerDelegate extends AbstractDatePickerDelegate {
        ...
        private final LinearLayout mSpinners;
        private final NumberPicker mDaySpinner;
        private final NumberPicker mMonthSpinner;
        private final NumberPicker mYearSpinner;
    }
}

代码如下:


private void getNumberPicker() {
    Class<? extends DatePicker> c =DatePicker.class;
    Field fd = null, fm = null, fy = null;
    View daySpinner = null;
    View monthSpinner= null;
    View yearSpinner = null;
    // 系统版本大于5.0
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        //获取资源的id
        int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
        int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android");
        int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android");
        if (daySpinnerId != 0 && monthSpinnerId!=0 && yearSpinnerId!=0) {
            daySpinner = this.findViewById(daySpinnerId);
            monthSpinner = this.findViewById(monthSpinnerId);
            yearSpinner = this.findViewById(yearSpinnerId);
        }
            //或者
           /*LinearLayout llFirst = (LinearLayout) getChildAt(0);
            LinearLayout mSpinners = (LinearLayout) llFirst.getChildAt(0);
            for (int i = 0; i < mSpinners.getChildCount(); i++)
            {
                NumberPicker picker = (NumberPicker) mSpinners.getChildAt(i);
                mPickers.add(i, picker);
            }
            return;*/
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        // 系统版本大于4.0
        fd = c.getDeclaredField("mDaySpinner");
        fm = c.getDeclaredField("mMonthSpinner");
        fy = c.getDeclaredField("mYearSpinner");
        if(fd!=null && fm!=null &&fy!=null){
            // 对字段获取设置权限
            fd.setAccessible(true);
            fm.setAccessible(true);
            fy.setAccessible(true);
            // 得到对应的控件
            daySpinner = (View) fd.get(this);
            monthSpinner= (View) fm.get(this);
            yearSpinner= (View) fy.get(this);
        }
    } else {
        fd = c.getDeclaredField("mDayPicker");
        fm = c.getDeclaredField("mMonthPicker");
        fy = c.getDeclaredField("mYearPicker");
        if(fd!=null && fm!=null &&fy!=null){
            // 对字段获取设置权限
            fd.setAccessible(true);
            fm.setAccessible(true);
            fy.setAccessible(true);
            // 得到对应的控件
            daySpinner = (View) fd.get(this);
            monthSpinner= (View) fm.get(this);
            yearSpinner= (View) fy.get(this);
        }
    }
    if (daySpinner != null && monthSpinner != null && yearSpinner != null) {
        daySpinner.setVisibility(View.GONE);
        if(daySpinner instanceof NumberPicker && monthSpinner instanceof NumberPicker && yearSpinner instanceof NumberPicker ){
            mPickers.add((NumberPicker) daySpinner);
            mPickers.add((NumberPicker) monthSpinner);
            mPickers.add((NumberPicker) yearSpinner);
        }
    }

}

注意:getIdentifier(String name, String defType, String defPackage) :获取资源ID
资源的名称 /资源的类型(drawable,string等) /包名

3、修改NumberPicker
 
    /**
     * 设置picker之间的间距
     */
    private void setPickerMargin(NumberPicker picker) {
        LinearLayout.LayoutParams p= (LinearLayout.LayoutParams) picker.getLayoutParams();
        p.setMargins(0,0,0,0);
        if(Build.VERSION.SDK_INT> Build.VERSION_CODES.JELLY_BEAN_MR1){
            p.setMarginStart(0);
            p.setMarginEnd(0);
        }
    }

    /**
     * 设置picker分割线的颜色
     */
    private void setDividerColor(NumberPicker picker) {
        Field field=NumberPicker.class.getDeclaredField("mSelectionDivider");
        if(field!=null){
            field.setAccessible(true);
            field.set(picker,new ColorDrawable(Color.RED));
        }
    }

    /**
     * 设置picker分割线的宽度
     */
    private void setNumberPickerDivider(NumberPicker picker) {
        Field[] fields=NumberPicker.class.getDeclaredFields();
        for(Field f:fields){
            if(f.getName().equals("mSelectionDividerHeight")){
                f.setAccessible(true);
                f.set(picker,1);
            break;
            }
        }
    }
修改前
修改后

参考:Android NumberPicker 修改分割线颜色和高度及字体颜色大小更改DatePicker中年月日的间隔和分隔线颜色

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,365评论 0 17
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,059评论 4 62
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,754评论 25 707
  • 南风萧萧吹散广陵曲十年安然洛阳路胡尘又起惹离乱如故牧歌飘 交错九州江湖 战马趋 再咏絮石头城下波涛怒谁又堪 兵戈苦...
    梦饮千樽月阅读 460评论 0 48
  • 麻烦问一下 大家 这个系统服务中的 时间与地点 流量是怎么产生的呢?我App中只是使用了CLLocationMan...
    wrlynxayy阅读 187评论 0 0