今天在使用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










