今天在使用DatePicker时真是被这个控件恶心到了。。。
1.月份的日期不会跟着月份或者年份变动
2.没有闰年的判断
好吧,看来只能自己判断了:
新建一个layout:
choise_date.xml



	

然后新建个类,继承自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放进去。

执行结果:

代码:
TestDataPicker

Trackback

no comment untill now

Add your comment now

请输入正确答案: 7+9= (required)