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

但是这样会出现问题:

对于不同手机上的时间格式设置,其布局可能是不一致的,这样设置出来的效果,在不同手机上的显示效果不一致,可能在A手机上显示  年、月,而在B手机上显示的是 年、日。

解决办法:

1、在API 11以上 ( 若你的项目最低兼容版本为 11,那么第一种方法就够用了)

自定义DatePickerDialog

其构造方法:

修改Dialog的title,让其也只显示年月

public MonPickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) {super(context, callBack, year, monthOfYear, dayOfMonth);this.setTitle(year + "年" + (monthOfYear + 1) + "月");}

同样修改其Title:

@Overridepublic void onDateChanged(DatePicker view, int year, int month, int day) {super.onDateChanged(view, year, month, day);this.setTitle(year + "年" + (month + 1) + "月");}

最后在其show方法中修改要显示的内容:

原理:通过获取年的值和日的值,来判断年View和日View的位置,因为年的值必定大于1970,而日的最大值为31,因此若第一个view的值 大于 最后一个View的值,那么就可确定dialog显示为 年-月-日,否则倒换。
@Overridepublic void show() {// TODO Auto-generated method stubsuper.show();DatePicker dp = this.getDatePicker();NumberPicker view0 = (NumberPicker) ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(0); //获取最前一位的宽度NumberPicker view1 = (NumberPicker) ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(1); //获取中间一位的宽度NumberPicker view2 = (NumberPicker) ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2);//获取最后一位的宽度//年的最大值为2100//月的最大值为11//日的最大值为28,29,30,31int value0 = view0.getMaxValue();//获取第一个View的最大值int value1 = view1.getMaxValue();//获取第二个View的最大值int value2 = view2.getMaxValue();//获取第三个View的最大值if(value0 >= 28 && value0 <= 31){view0.setVisibility(View.GONE);}else if(value1 >= 28 && value1 <= 31){view1.setVisibility(View.GONE);}else if(value2 >= 28 && value2 <= 31){view2.setVisibility(View.GONE);}
}

若你的项目最低兼容版本小于11,则需要用到下面内容(因为getDatePicker()方法和NumberPicker 均在API 11以上才有)

if(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB){//查找DatePickerDatePicker dp = findDatePicker((ViewGroup) getWindow().getDecorView()); //获取其子控件,包含 年、月、日ViewGroup view0 = (ViewGroup)((ViewGroup) dp.getChildAt(0)).getChildAt(0);ViewGroup view1 = (ViewGroup)((ViewGroup) dp.getChildAt(0)).getChildAt(1);ViewGroup view2 = (ViewGroup)((ViewGroup) dp.getChildAt(0)).getChildAt(2);//获取子控件中的EditText显示控件(就是中间显示年月日的)EditText et0 = (EditText)view0.getChildAt(1);EditText et1 = (EditText)view1.getChildAt(1);EditText et2 = (EditText)view2.getChildAt(1);//获取当前日int dayOfMonth = dp.getDayOfMonth();//获取三个显示控件的值String str0 = et0.getText().toString().trim();String str1 = et1.getText().toString().trim();String str2 = et2.getText().toString().trim();//进行匹配,如果和当前日的值相同,则隐藏它 ( BUG:若初始化值为5月5号,可能会出错)//一般情况下 年-月-日 或者 月-日-年情况比较常见,所以先比较str[2]->str[1]->str[0],降低出错概率if((""+dayOfMonth).equals(str2)){view0.setVisibility(View.GONE);}else if((""+dayOfMonth).equals(str1)){view1.setVisibility(View.GONE);}else if((""+dayOfMonth).equals(str0)){view2.setVisibility(View.GONE);}}

/*** 低版本中获取DatePicker* @param group* @return*/private DatePicker findDatePicker(ViewGroup group) {if (group != null) {for (int i = 0, j = group.getChildCount(); i < j; i++) {View child = group.getChildAt(i);if (child instanceof DatePicker) {return (DatePicker) child;} else if (child instanceof ViewGroup) {DatePicker result = findDatePicker((ViewGroup) child);if (result != null)return result;}}}return null;} 

android 修改DatePickerDialog只显示“年月”,去掉“日”显示相关推荐

  1. Android的DatePickerDialog只显示年月

    public class YearMonthDatePickerDialog extends DatePickerDialog {public YearMonthDatePickerDialog(Co ...

  2. easyui datebox时间控件如何只显示年月

    easyui datebox控件,只显示年月,不显示年月日 需要的效果图如下: 具体的js代码: <script>$(function(){intiMonthBox('costTime') ...

  3. Android日历只显示年月,只显示年

    Android日历只显示年月 款式如下: public class YearPickerDialog extends DatePickerDialog {public YearPickerDialog ...

  4. 微博只显示来自android,修改手机发新浪微博显示的来源

    我们用手机发微博的时候,会在微博下面有个"来自xxx"的来源.一些朋友想换一个显示内容,改怎么做呢?其实还是很简单的,下面是针对Android系统的操作方法: 1.首先要root你 ...

  5. android 改变来电号码,Android8.1 MTK平台 Dialer修改(来电全屏、归属地显示)

    来电默认全屏 默认情况下,来电android是以通知窗口的形式显示,只在屏幕的顶部显示,现在改为全屏显示 修改位置 alps\vendor\mediatek\proprietary\packages\ ...

  6. ABAP日期函数(求月末日,第几周,search help 只显示年月) 使用方法实例

    计算两个日期间的工作天数,就是剔除了双休日后的天数.( 待考证) DATE_CONVERT_TO_FACTORYDATE HR_HK_DIFF_BT_2_DATES 根据当前时间如何找到上月的第一天和 ...

  7. html只能选择年月,EasyUi日期控件datebox设置,只显示年月,也只能选择年月

    EasyUi日期控件datebox设置,只显示年月,也只能选择年月 1.input 代码 年月 1 2 3 4 5 6 7 8 2.设置只显示年月,只能选持年月: $(function() { $(' ...

  8. bootstrap日期控件 只显示 年月

    <!DOCTYPE html> <html lang="zh" xmlns:th="http://www.thymeleaf.org" > ...

  9. easyUI datebox 日期只显示年月及年月日切换的实现 js样式重新渲染加载

    记录一下,最近的做的一个功能,需要在easyUI的日期框datebox 中,只显示年月格式,同时,还需要切换到年月日的格式 第一步:如何显示年月日,默认当前一天 如下代码是:报表日期及时间选择框 报表 ...

最新文章

  1. php签名是做什么用的,这个签名在PHP中意味着什么()?
  2. python程序设计教材浅显易懂_这些python自学技巧,你不会?
  3. Tiles Framework
  4. AngularJS跨域问题 ajax 跨域
  5. 【youcans 的 OpenCV 例程200篇】117. 形态学操作之顶帽运算
  6. 窄带物联网(NB-IoT)技术开发云平台的系统构架图是什么?
  7. theano 编程技巧
  8. UAT测试和SIT测试的区别
  9. 初识前端模板引擎jade
  10. 网页右下角弹出窗体实现代码
  11. Spring的AOP实现原理
  12. Docker容器的capability
  13. centos7 安装7z压缩命令
  14. HttpRequest 和HttpWebRequest的区别(转)
  15. 上海大学2021年博士研究生招生简章
  16. Java语言规格说明
  17. OCH1660全极高灵敏低功耗霍尔开关
  18. 退了IBM对日软件外包实训有些天了
  19. freemarker生成word之后遇到未解决的问题,希望有大佬赐教!!!
  20. 论通用病历文档格式标准

热门文章

  1. 诺基亚7 刷android p,诺基亚真良心:所有手机先升 Android O,再升 Android P
  2. JS中export怎么用
  3. 【基于UML软件建模的人事管理系统】
  4. 【北行★户外】6月29日周日 走进北方梦里桃花源.清凉谷.密云水库.戏水.休闲.摄影.吃虹蹲鱼.一日休闲游 !
  5. CentOS 6.8下mongodb数据库安装
  6. 麻将高效鬼牌胡牌算法(C++版)
  7. PAT (Advanced) 1077. Kuchiguse (20)
  8. GPS(Global Position System)全球定位系统原理
  9. 人工智能算法综述 (一)
  10. Excel数值函数(5):COUNTIF,统计符合指定条件的单元格数量