android指定DatePickerDialog样式并不显示年的实现代码

作者:jingxian 时间:2022-07-13 05:23:08 

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

android指定DatePickerDialog样式并不显示年的实现代码

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

android指定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)就是获取了当前实例所拥有的这个字段值,当然就是显示的这个“年”了,就可以对这个进行操作了,而我只需要隐藏就可以了。有网上看了有些说通过布局来一层层获取,这种方法可读性不高,而且不同的版本改动而已的可能性很大,这样就获取不到这个“年”了,相对来说,改动这个字段名的可能性应该会小些。

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

标签:datepickerdialog样式
0
投稿

猜你喜欢

  • Unity计时器功能实现示例

    2022-03-08 20:02:39
  • Java调用Oracle存储过程详解

    2022-09-09 03:19:45
  • Springboot公共字段填充及ThreadLocal模块改进方案

    2023-11-17 22:58:39
  • Spring的异常重试框架Spring Retry简单配置操作

    2023-11-25 18:27:35
  • SpringBoot如何优雅的整合Swagger Api自动生成文档

    2022-08-10 00:49:29
  • 基于Java代码实现支付充值的通用流程

    2021-09-04 00:48:45
  • Java内存模型JMM与volatile

    2022-03-25 09:33:50
  • Java中使用内存映射实现大文件上传实例

    2022-01-16 05:02:16
  • Mybatis实现插入数据后返回主键过程解析

    2022-07-14 18:43:15
  • Spring5新功能@Nullable注解及函数式注册对象

    2021-10-27 05:49:44
  • Java 详解包装类Integer与int有哪些共通和不同

    2022-06-15 20:12:18
  • Unity 从Resources中动态加载Sprite图片的操作

    2023-08-26 11:37:18
  • C#中面向对象编程机制之多态学习笔记

    2023-12-06 20:16:33
  • 使用Spring Data Redis实现数据缓存的方法

    2021-08-02 10:19:25
  • java开发BeanUtils类解决实体对象间赋值

    2022-08-25 06:31:25
  • Java中比较抽象类与接口的异同

    2023-09-24 01:50:40
  • Spring Boot加密配置文件特殊内容的示例代码详解

    2023-09-18 08:47:24
  • RestTemplate自定义请求失败异常处理示例解析

    2021-12-03 22:13:17
  • c#实现服务器性能监控并发送邮件保存日志

    2023-09-10 11:56:14
  • java中的JsonSerializer用法,前后端单位转换必备

    2022-05-01 07:58:48
  • asp之家 软件编程 m.aspxhome.com