Android DatePicker控件存在一个已知的bug,即无法正确设置最大日期。以下是一个解决该bug的代码示例:
import android.app.DatePickerDialog;
import android.content.Context;
import android.os.Build;
import android.widget.DatePicker;
import java.lang.reflect.Field;
import java.util.Calendar;
import java.util.Date;
public class FixedDatePickerDialog extends DatePickerDialog {
private int maxYear;
private int maxMonth;
private int maxDay;
public FixedDatePickerDialog(Context context, OnDateSetListener listener, int year, int month, int dayOfMonth) {
super(context, listener, year, month, dayOfMonth);
getMaxDate(year, month, dayOfMonth);
}
private void getMaxDate(int year, int month, int dayOfMonth) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, month, dayOfMonth);
Date maxDate = calendar.getTime();
Calendar maxCalendar = Calendar.getInstance();
maxCalendar.setTime(maxDate);
maxYear = maxCalendar.get(Calendar.YEAR);
maxMonth = maxCalendar.get(Calendar.MONTH);
maxDay = maxCalendar.get(Calendar.DAY_OF_MONTH);
}
@Override
public void onDateChanged(DatePicker view, int year, int month, int dayOfMonth) {
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
DatePickerDialog datePickerDialog = (DatePickerDialog) view.getTag();
if (datePickerDialog != null) {
datePickerDialog.getDatePicker().setMaxDate(getMaxDate().getTime());
}
} else {
super.onDateChanged(view, year, month, dayOfMonth);
}
}
private Date getMaxDate() {
Calendar calendar = Calendar.getInstance();
calendar.set(maxYear, maxMonth, maxDay);
return calendar.getTime();
}
public static DatePickerDialog createFixedDatePickerDialog(Context context, int year, int month, int dayOfMonth, OnDateSetListener listener) {
DatePickerDialog datePickerDialog = new FixedDatePickerDialog(context, listener, year, month, dayOfMonth);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
DatePicker datePicker = datePickerDialog.getDatePicker();
try {
Field mDelegateField = datePicker.getClass().getDeclaredField("mDelegate");
mDelegateField.setAccessible(true);
Object delegate = mDelegateField.get(datePicker);
Field mMaxYearField = delegate.getClass().getDeclaredField("mMaxYear");
mMaxYearField.setAccessible(true);
mMaxYearField.set(delegate, year);
} catch (Exception e) {
e.printStackTrace();
}
}
return datePickerDialog;
}
}
使用方法:
FixedDatePickerDialog datePickerDialog = FixedDatePickerDialog.createFixedDatePickerDialog(this, year, month, day, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
// 处理日期选择事件
}
});
datePickerDialog.show();
这段代码创建了一个FixedDatePickerDialog
类,继承自DatePickerDialog
,并覆盖了onDateChanged
方法,以确保最大日期被正确设置。在Android 5.0及以上的版本中,通过反射设置mMaxYear
字段来修复DatePicker控件的bug。