android指定DatePickerDialog样式并不显示年

原创 2015年07月10日 15:35:05

有很多地方要用到DatePickerDialog。但有时项目用到的主题样式是很丑的样式,显示出来的真丑。


而我们真正想要的样式是这样的。


这个就漂亮多了。而且很多的时候都不需要显示“年”,下面看通过指定主题来显示自己想要的样式,并且通过反射机制来隐藏“年”,而且可以举一反三,对这上面的东西做任务的修改。

 private void showDatePickerDialog() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        int year = calendar.get(Calendar.YEAR);
        final int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), AlertDialog.THEME_HOLO_LIGHT, onDateSetListener, year, month, day);
        datePickerDialog.setCancelable(true);
        DatePicker dp = datePickerDialog.getDatePicker();
        //设置当天为最小值
        dp.setMinDate(calendar.getTimeInMillis());
        //设置最大值是7天
        calendar.set(Calendar.DAY_OF_MONTH, day + 6);
        dp.setMaxDate(calendar.getTimeInMillis());
        try {
            //获取指定的字段
            Field field =  dp.getClass().getDeclaredField("mYearSpinner");
            //解封装
            field.setAccessible(true);
            //获取当前实例的值
            NumberPicker np = ((NumberPicker) field.get(dp));
            np.setVisibility(View.GONE);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        datePickerDialog.show();

    }

在实例化DatePickerDialog的时候,第二个参数指定了主题为THEME_HOLO_LIGHT就是想要的样式,而且有一个很好玩的地方,你可以传任何类型为int的值,来看看你手机支持哪些乱七八糟的主题,当然这只是玩下,还是正规点写上这个指定主题。

try{}catch(){}里面开始使用反射来获取“年”的布局,因为源码里年的这个字段使用了private修饰,而且没有get方法提供,所以要用getDeclareField()来获取这个Field.然后解封装,否则也是获取不到的,也就是setAccessible(true),意思就是可访问了,这个时候获取到的还不是当前实例的值,只是得到了这个类里面的一个字段信息,最后一句,filed.get(Object)就是获取了当前实例所拥有的这个字段值,当然就是显示的这个“年”了,就可以对这个进行操作了,而我只需要隐藏就可以了。有网上看了有些说通过布局来一层层获取,这种方法可读性不高,而且不同的版本改动而已的可能性很大,这样就获取不到这个“年”了,相对来说,改动这个字段名的可能性应该会小些。


结束,这只是提供一种思路,可能还有更好的办法,大神勿喷!


版权声明:本文为博主原创文章,未经博主欢迎转载,记得加上本文出处哟~~

Android DatePicker 显示问题 可分别隐藏年、月或日

try {      Field f[] = datePicker.getClass().getDeclaredFields();      //隐藏年份      for (Field fie...
  • csdnadcode
  • csdnadcode
  • 2014年08月22日 19:20
  • 2263

Android中DatePicker只显示年月的方法

最近项目中有一个选择信用卡有效期的功能,只需要选择年月,但是Android原生的DatePicker默认是可以选择年月日的,所以我们要做下特殊的处理, 并且Android5.0以上和以下的版本的处理方...
  • njweiyukun
  • njweiyukun
  • 2015年12月17日 10:22
  • 6259

DatePickerDialog 时间范围的设置方法(setMaxDate,setMinDate)

部分代码如下: Calendar mCalendar = Calendar.getInstance(); final DatePickerDialog dateDialog = new DateP...
  • songyunbiao
  • songyunbiao
  • 2015年04月22日 09:48
  • 6129

android 修改DatePickerDialog只显示“年月”,去掉“日”显示

这两天在做一个项目,其中有个需求是让用户填写学业经历,那么只能选择年月,而不能出现日选择。通过在网上查资料,发现原理都是通过获取到Dialog布局中的年月日分别相对应的View,然后将其设置为GONE...
  • xyz326547445
  • xyz326547445
  • 2014年10月28日 15:07
  • 2636

DatePickerDialog的样式改变

DatePickerDialog的使用方法比较简单 new的时候第二个参数就是设置它的样式属性 @SuppressWarnings("ResourceType") public voi...
  • suwenlai
  • suwenlai
  • 2017年05月03日 10:39
  • 3824

修改DatePickerDialog的样式

使用Android原生控件DatePickerDialog的时候发现样式是日历,但是我想要的下面图中的效果。 开始搞不清楚为什么,后来百度发现是因为Theme的原因,网上只告诉Theme需要改成...
  • WZSDXS
  • WZSDXS
  • 2016年07月30日 17:40
  • 8309

Android DatePicker 显示问题 可分别隐藏年、月或日

try {      Field f[] = datePicker.getClass().getDeclaredFields();      //隐藏年份      for (Field fie...
  • csdnadcode
  • csdnadcode
  • 2014年08月22日 19:20
  • 2263

Android 7.0下仿7.0之前的时间框及去掉日选择框方法

package com.bonc.mobile.common.view;import java.lang.reflect.Constructor; import java.lang.reflect.F...
  • xiaoduo0629
  • xiaoduo0629
  • 2017年02月09日 09:44
  • 1356

DatePickerDialog 只显示年 (解决不同语言顺序不一样的问题)

速度出来
  • u012305958
  • u012305958
  • 2015年11月22日 16:47
  • 1521

android 修改DatePickerDialog只显示“年月”,去掉“日”显示

这两天在做一个项目,其中有个需求是让用户填写学业经历,那么只能选择年月,而不能出现日选择。通过在网上查资料,发现原理都是通过获取到Dialog布局中的年月日分别相对应的View,然后将其设置为GONE...
  • xyz326547445
  • xyz326547445
  • 2014年10月28日 15:07
  • 2636
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android指定DatePickerDialog样式并不显示年
举报原因:
原因补充:

(最多只允许输入30个字)