android的DatePicker控件bug处理

一旦把系统时间变成月末的两天,比如31号和30号,然后再用这个控件就会发现,他日期跟月份联动不起来了,二月可以到31号,问题重重

好吧,看来只能自己判断了:
新建一个layout:
choise_date.xml
  1. <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content">  
  2.     <datepicker android:id="@+id/datepicker_date" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerhorizontal="true">  
  3. </datepicker>  
  4. </relativelayout>  

然后新建个类,继承自LinearLayout用来显示在弹出的对话框中:

  1. package com.zhang.test.views;  
  2.   
  3. import java.util.Calendar;  
  4. import java.util.GregorianCalendar;  
  5.   
  6. import com.zhang.test.R;  
  7.   
  8. import android.content.Context;  
  9. import android.util.AttributeSet;  
  10. import android.view.LayoutInflater;  
  11. import android.view.View;  
  12. import android.widget.DatePicker;  
  13. import android.widget.LinearLayout;  
  14. import android.widget.DatePicker.OnDateChangedListener;  
  15.   
  16. public class DatePickerDialogView extends LinearLayout {  
  17.   
  18.     private static final String TAG = "DatePickerDialogView";  
  19.     private static Context mContext;  
  20.   
  21.     private DatePicker mDatePicker;  
  22.   
  23.     private Calendar mC;  
  24.   
  25.     public DatePickerDialogView(Context context, AttributeSet attrs) {  
  26.         super(context, attrs);  
  27.         initialize(context);  
  28.     }  
  29.   
  30.     public DatePickerDialogView(Context context) {  
  31.         super(context);  
  32.         initialize(context);  
  33.     }  
  34.   
  35.     private void initialize(Context context) {  
  36.         mC = Calendar.getInstance();  
  37.   
  38.         mContext = context;  
  39.         View view = LayoutInflater.from(mContext).inflate(R.layout.choise_date, null);  
  40.         mDatePicker = (DatePicker) view.findViewById(R.id.datepicker_date);  
  41.         mDatePicker.init(mC.get(Calendar.YEAR), mC.get(Calendar.MONTH), mC.get(Calendar.DAY_OF_MONTH), onDateChangedListener);  
  42.   
  43.         addView(view);  
  44.     }  
  45.   
  46.     /** 
  47.      * 日期更改时监听事件 
  48.      */  
  49.     private OnDateChangedListener onDateChangedListener = new OnDateChangedListener() {  
  50.   
  51.         @Override  
  52.         public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {  
  53.   
  54.             //判断闰年  
  55.             boolean mIsLeapYear = ((GregorianCalendar)mC).isLeapYear(year);  
  56.   
  57.             if(mIsLeapYear && monthOfYear == 1 && dayOfMonth > 29) {  
  58.                 //闰年,2月,天数大于29天  
  59.                 view.init(year, monthOfYear, 29, onDateChangedListener);  
  60.             } else if(mIsLeapYear && monthOfYear == 1) {  
  61.                 //由于控件bug,只要是闰年,同时月份是2月份,就去init控件  
  62.                 view.init(year, monthOfYear, dayOfMonth, onDateChangedListener);  
  63.             } else if(!mIsLeapYear && monthOfYear == 1 && dayOfMonth > 28) {  
  64.                 //平年,2月,天数大于28天  
  65.                 view.init(year, monthOfYear, 28, onDateChangedListener);  
  66.             } else if(!mIsLeapYear && (monthOfYear != 1) && ((monthOfYear + 1) % 2 == 0) && (dayOfMonth > 30)) {  
  67.                 //平年,除2月外,可以被2整出的月份(4,6,8,10,12),月份总天数大于30天  
  68.                 view.init(year, monthOfYear, 30, onDateChangedListener);  
  69.             } else if((monthOfYear != 1) && ((monthOfYear + 1) % 2 == 0) && (dayOfMonth > 30)) {  
  70.                 //除2月外,可以被2整出的月份(4,6,8,10,12),月份总天数大于30天  
  71.                 view.init(year, monthOfYear, 30, onDateChangedListener);  
  72.             }  
  73.         }  
  74.     };  
  75.   
  76.     /** 
  77.      * 获得日期 
  78.      * @return String 
  79.      */  
  80.     public String getDate() {  
  81.         return mDatePicker.getYear() + "-" + (mDatePicker.getMonth() + 1) + "-" + mDatePicker.getDayOfMonth();  
  82.     }  
  83.   
  84. }  

主要是使用DatePicker的init方法的对控件变更时进行监听。

最后是activity:

  1. package com.zhang.test;  
  2.   
  3. import java.util.Calendar;  
  4.   
  5. import com.zhang.test.views.DatePickerDialogView;  
  6.   
  7. import android.app.Activity;  
  8. import android.app.AlertDialog;  
  9. import android.app.AlertDialog.Builder;  
  10. import android.content.Context;  
  11. import android.content.DialogInterface;  
  12. import android.os.Bundle;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.EditText;  
  17.   
  18. public class MainActivity extends Activity {  
  19.   
  20.     private static final String TAG = "MainActivity";  
  21.     private static Context mContext;  
  22.   
  23.     private Button btnChange;  
  24.     private EditText dateEditText;  
  25.   
  26.     /** Called when the activity is first created. */  
  27.     @Override  
  28.     public void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.main);  
  31.         mContext = this;  
  32.         btnChange = (Button) findViewById(R.id.button_change);  
  33.         dateEditText = (EditText) findViewById(R.id.EditText01);  
  34.   
  35.         btnChange.setOnClickListener(new OnClickListener() {  
  36.   
  37.             @Override  
  38.             public void onClick(View v) {  
  39.                 AlertDialog.Builder a = new Builder(mContext);  
  40.                 final DatePickerDialogView dateView = new DatePickerDialogView(mContext);  
  41.                 a.setTitle("选择日期");  
  42.                 a.setView(dateView);  
  43.                 a.setPositiveButton("确定",new DialogInterface.OnClickListener() {  
  44.   
  45.                     @Override  
  46.                     public void onClick(DialogInterface dialog, int which) {  
  47.                         dateEditText.setText(dateView.getDate());  
  48.                     }  
  49.                 });  
  50.                 a.show();  
  51.             }  
  52.         });  
  53.         Calendar c = Calendar.getInstance();  
  54.         dateEditText.setText(c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-" + c.get(Calendar.DAY_OF_MONTH));  
  55.     }  
  56. }  

通过AlertDialog.Builder弹出一个对话框,再通过对话框的setView方法把刚才自定义的Veiw放进去。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值