一旦把系统时间变成月末的两天,比如31号和30号,然后再用这个控件就会发现,他日期跟月份联动不起来了,二月可以到31号,问题重重
好吧,看来只能自己判断了:新建一个layout:
choise_date.xml
- <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content">
- <datepicker android:id="@+id/datepicker_date" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerhorizontal="true">
- </datepicker>
- </relativelayout>
然后新建个类,继承自LinearLayout用来显示在弹出的对话框中:
- package com.zhang.test.views;
- import java.util.Calendar;
- import java.util.GregorianCalendar;
- import com.zhang.test.R;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.widget.DatePicker;
- import android.widget.LinearLayout;
- import android.widget.DatePicker.OnDateChangedListener;
- public class DatePickerDialogView extends LinearLayout {
- private static final String TAG = "DatePickerDialogView";
- private static Context mContext;
- private DatePicker mDatePicker;
- private Calendar mC;
- public DatePickerDialogView(Context context, AttributeSet attrs) {
- super(context, attrs);
- initialize(context);
- }
- public DatePickerDialogView(Context context) {
- super(context);
- initialize(context);
- }
- private void initialize(Context context) {
- mC = Calendar.getInstance();
- mContext = context;
- View view = LayoutInflater.from(mContext).inflate(R.layout.choise_date, null);
- mDatePicker = (DatePicker) view.findViewById(R.id.datepicker_date);
- mDatePicker.init(mC.get(Calendar.YEAR), mC.get(Calendar.MONTH), mC.get(Calendar.DAY_OF_MONTH), onDateChangedListener);
- addView(view);
- }
- /**
- * 日期更改时监听事件
- */
- private OnDateChangedListener onDateChangedListener = new OnDateChangedListener() {
- @Override
- public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
- //判断闰年
- boolean mIsLeapYear = ((GregorianCalendar)mC).isLeapYear(year);
- if(mIsLeapYear && monthOfYear == 1 && dayOfMonth > 29) {
- //闰年,2月,天数大于29天
- view.init(year, monthOfYear, 29, onDateChangedListener);
- } else if(mIsLeapYear && monthOfYear == 1) {
- //由于控件bug,只要是闰年,同时月份是2月份,就去init控件
- view.init(year, monthOfYear, dayOfMonth, onDateChangedListener);
- } else if(!mIsLeapYear && monthOfYear == 1 && dayOfMonth > 28) {
- //平年,2月,天数大于28天
- view.init(year, monthOfYear, 28, onDateChangedListener);
- } else if(!mIsLeapYear && (monthOfYear != 1) && ((monthOfYear + 1) % 2 == 0) && (dayOfMonth > 30)) {
- //平年,除2月外,可以被2整出的月份(4,6,8,10,12),月份总天数大于30天
- view.init(year, monthOfYear, 30, onDateChangedListener);
- } else if((monthOfYear != 1) && ((monthOfYear + 1) % 2 == 0) && (dayOfMonth > 30)) {
- //除2月外,可以被2整出的月份(4,6,8,10,12),月份总天数大于30天
- view.init(year, monthOfYear, 30, onDateChangedListener);
- }
- }
- };
- /**
- * 获得日期
- * @return String
- */
- public String getDate() {
- return mDatePicker.getYear() + "-" + (mDatePicker.getMonth() + 1) + "-" + mDatePicker.getDayOfMonth();
- }
- }
主要是使用DatePicker的init方法的对控件变更时进行监听。
最后是activity:
- package com.zhang.test;
- import java.util.Calendar;
- import com.zhang.test.views.DatePickerDialogView;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.app.AlertDialog.Builder;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- public class MainActivity extends Activity {
- private static final String TAG = "MainActivity";
- private static Context mContext;
- private Button btnChange;
- private EditText dateEditText;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mContext = this;
- btnChange = (Button) findViewById(R.id.button_change);
- dateEditText = (EditText) findViewById(R.id.EditText01);
- btnChange.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- AlertDialog.Builder a = new Builder(mContext);
- final DatePickerDialogView dateView = new DatePickerDialogView(mContext);
- a.setTitle("选择日期");
- a.setView(dateView);
- a.setPositiveButton("确定",new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dateEditText.setText(dateView.getDate());
- }
- });
- a.show();
- }
- });
- Calendar c = Calendar.getInstance();
- dateEditText.setText(c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-" + c.get(Calendar.DAY_OF_MONTH));
- }
- }
通过AlertDialog.Builder弹出一个对话框,再通过对话框的setView方法把刚才自定义的Veiw放进去。