[Android]只显示月和日的DatePickerDialog

前言

 需求要只显示月和日的日历控件,又不想自定义控件,最简单的办法就是隐藏显示年的这个框了,但DatePickerDialog并没有直接提供方法来操作,这里分享一个笨办法:)

 

声明

  欢迎转载,但请保留文章原始出处:) 

    博客园:http://www.cnblogs.com

    农民伯伯: http://over140.cnblogs.com   

 

正文

  一、效果图

    1.1 默认

 

    1.2 处理后 

 

 

[java] view plain copy print ?
  1. package com.celery.util;  
  2.   
  3. import java.lang.reflect.Field;  
  4.   
  5. import android.app.DatePickerDialog;  
  6. import android.content.Context;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.DatePicker;  
  10. import android.widget.LinearLayout;  
  11. /** 
  12.  * @author joker 
  13.  * 自定义的日期控件,只有年和月,没有日 
  14.  * 2012-10-17 上午11:02:17  
  15.  */  
  16. public class mDatePickerDialog extends DatePickerDialog {  
  17.      public mDatePickerDialog(Context context,  
  18.              OnDateSetListener callBack, int year, int monthOfYear) {  
  19.          super(context, callBack, year, monthOfYear, 3);  
  20.          this.setTitle(year+"年"+(monthOfYear + 1) + "月" );  
  21.      }  
  22.   
  23.      @Override  
  24.      public void onDateChanged(DatePicker view, int year, int month, int day) {  
  25.          super.onDateChanged(view, year, month, day);  
  26.          this.setTitle(year+"年"+(month + 1) + "月" );  
  27.      }  
  28.   
  29.     /* (non-Javadoc) 
  30.      * @see android.app.DatePickerDialog#show() 
  31.      */  
  32.     @Override  
  33.     public void show() {  
  34.         // TODO Auto-generated method stub  
  35.         super.show();  
  36.          DatePicker dp = findDatePicker((ViewGroup) this.getWindow().getDecorView());  
  37.             if (dp != null) {  
  38.                 Class c=dp.getClass();  
  39.                 Field f;  
  40.                 try {  
  41.                         if(GlobalVar.sdkversion>4.0){  
  42.                             f = c.getDeclaredField("mDaySpinner");  
  43.                             f.setAccessible(true );    
  44.                             LinearLayout l= (LinearLayout)f.get(dp);     
  45.                             l.setVisibility(View.GONE);  
  46.                         }else{  
  47.                             f = c.getDeclaredField("mDayPicker");  
  48.                             f.setAccessible(true );    
  49.                             LinearLayout l= (LinearLayout)f.get(dp);     
  50.                             l.setVisibility(View.GONE);  
  51.                         }  
  52.                 } catch (SecurityException e) {  
  53.                     // TODO Auto-generated catch block  
  54.                     e.printStackTrace();  
  55.                 } catch (NoSuchFieldException e) {  
  56.                     // TODO Auto-generated catch block  
  57.                     e.printStackTrace();  
  58.                 } catch (IllegalArgumentException e) {  
  59.                     // TODO Auto-generated catch block  
  60.                     e.printStackTrace();  
  61.                 } catch (IllegalAccessException e) {  
  62.                     // TODO Auto-generated catch block  
  63.                     e.printStackTrace();  
  64.                 }    
  65.                   
  66.             }   
  67.     }  
  68.     /** 
  69.      * 从当前Dialog中查找DatePicker子控件 
  70.      *  
  71.      * @param group 
  72.      * @return 
  73.      */  
  74.     private DatePicker findDatePicker(ViewGroup group) {  
  75.         if (group != null) {  
  76.             for (int i = 0, j = group.getChildCount(); i < j; i++) {  
  77.                 View child = group.getChildAt(i);  
  78.                 if (child instanceof DatePicker) {  
  79.                     return (DatePicker) child;  
  80.                 } else if (child instanceof ViewGroup) {  
  81.                     DatePicker result = findDatePicker((ViewGroup) child);  
  82.                     if (result != null)  
  83.                         return result;  
  84.                 }   
  85.             }  
  86.         }  
  87.         return null;  
  88.   
  89.     }   
  90.         
  91. }  

   需求要只显示年和月的日期选择控件,又不想自定义控件,最简单的办法就是隐藏显示日的这个框了,但DatePickerDialog并没有直接提供方法来操作,这里分享一个笨办法:

    农民伯伯的这篇文章:http://www.cnblogs.com/over140/archive/2011/09/20/2181532.html,虽然可以实现,但是当手机在4.0以上,控件进行了重写,观察源码发现在4.0以下日期框的名字叫'mDayPicker',4.0以上叫‘mDaySpinner’,于是我们可以先获取sdk的版本然后进行判断,然后再循环反射控件拿到属性进行隐藏了。

      大功告成!


你可能感兴趣的:(Datepicker,日历)