api级别11之前的Android datepicker最小最大日期
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10836679/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android datepicker min max date before api level 11
提问by Bahri G?kcan
I am trying to set the min and max date of the date picker in Android to before API level 11. I used the following code:
我正在尝试将 Android 中日期选择器的最小和最大日期设置为 API 级别 11 之前。我使用了以下代码:
mDatePickerField = startDatePickerDialog.getClass().getDeclaredField("mDatePicker");
mDatePickerField.setAccessible(true);
DatePicker startDatePickerInstance =(DatePicker)mDatePickerField.get(startDatePickerDialog);
startDatePickerInstance.init(mYearMin, mMonthMin, mDayMin, new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker datePicker, int i, int i1, int i2) {
Date maxDate = new Date(mYearMax, mMonthMax, mDayMax, 0, 0, 0);
Date selectedDate = new Date(i, i1, i2, 0, 0, 0);
if (selectedDate.after(maxDate)) {
datePicker.updateDate(mYearMax, mMonthMax, mDayMax);
}
}
}
However, the updateDate
method fires onDateChanged
again and the date picker is not updated.
Can anyone help to solve the problem?
但是,该updateDate
方法onDateChanged
再次触发并且日期选择器未更新。
任何人都可以帮助解决问题吗?
回答by yostyle
You can set range with init datePicker method. Example with min value :
您可以使用 init datePicker 方法设置范围。最小值示例:
// Calendar
this.calendar = new GregorianCalendar();
this.datePicker = (DatePicker) findViewById(R.id.xxxxx);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// (picker is a DatePicker)
this.datePicker.setMinDate(this.calendar.getTimeInMillis());
} else {
final int minYear = this.calendar.get(Calendar.YEAR);
final int minMonth = this.calendar.get(Calendar.MONTH);
final int minDay = this.calendar.get(Calendar.DAY_OF_MONTH);
this.datePicker.init(minYear, minMonth, minDay,
new OnDateChangedListener() {
public void onDateChanged(DatePicker view, int year,
int month, int day) {
Calendar newDate = Calendar.getInstance();
newDate.set(year, month, day);
if (calendar.after(newDate)) {
view.init(minYear, minMonth, minDay, this);
}
}
});
Log.w(TAG, "API Level < 11 so not restricting date range...");
}
回答by Ramesh Bugatha
This DatePicker custom class Allow us Specify Max and Min Date
这个 DatePicker 自定义类允许我们指定最大和最小日期
public class DatePickerDialogWithMaxMinRange extends DatePickerDialog {
static int maxYear=2005;
static int maxMonth=11;
static int maxDay=31;
int minYear=1955;
int minMonth=0;
int minDay=1;
public DatePickerDialogWithMaxMinRange(Context context, OnDateSetListener callBack,int minYear,int minMonth,int minDay,int maxYear,int maxMonth,int maxDay) {
super(context,callBack, maxYear, maxMonth, maxDay);
this.minDay = minDay;
this.minMonth = minMonth;
this.minYear = minYear;
DatePickerDialogWithMaxMinRange.maxDay = maxDay;
DatePickerDialogWithMaxMinRange.maxMonth = maxMonth;
DatePickerDialogWithMaxMinRange.maxYear = maxYear;
}
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
super.onDateChanged(view, year, monthOfYear, dayOfMonth);
if (year > maxYear ||monthOfYear > maxMonth && year == maxYear||
dayOfMonth > maxDay && year == maxYear && monthOfYear == maxMonth){
view.updateDate(maxYear, maxMonth, maxDay);
}else if(year < minYear ||monthOfYear < minMonth && year == minYear||
dayOfMonth < minDay && year == minYear && monthOfYear == minMonth){
view.updateDate(minYear, minMonth, minDay );
}
}
}
}
// use this code in your Activity class or Fragment specify member as
// 在您的 Activity 类或 Fragment 中使用此代码将成员指定为
private int intCurrentYear;
private int intCurrentMonth;
private int intCurrentDay;
private int intMaxYear;
private int intMaxMonth;
private int intMaxDay;
private int intMinYear;
private int intMinDay;
private int intMinMonth;
DatePickerDialogWithMaxMinRange datePickerDialog= null;
DatePickerDialog.OnDateSetListener datePickerOnDateSetListener;
Calendar myCalendar;
// call this method in onCreate or where ever u want to..
// 在 onCreate 或任何你想要的地方调用这个方法..
note: you need pass the listener custom datepickerdialog to update the date after select in datepicker dialog
注意:在日期选择器对话框中选择后,您需要通过侦听器自定义日期选择器对话框来更新日期
public void setDate() {
/*
* Initialise Listener for date set
*/
datePickerOnDateSetListener = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
edtTxtPlayerBirthDay.setText(new StringBuilder().append(year)
.append("-").append(monthOfYear + 1).append("-")
.append(dayOfMonth));
}
};
// initialise DatePicker
myCalendar = Calendar.getInstance();
intCurrentYear = myCalendar.get(Calendar.YEAR);
intCurrentMonth = myCalendar.get(Calendar.MONTH);
intCurrentDay = myCalendar.get(Calendar.DAY_OF_MONTH);
intMaxYear = intCurrentYear - 2000;
intMaxMonth = intCurrentMonth;
intMaxDay = intCurrentDay;
intMinYear = intCurrentYear - 1950;
intMinMonth = intCurrentMonth;
intMinDay = intCurrentDay;
datePickerDialog = new DatePickerDialogWithMaxMinRange(
context, datePickerOnDateSetListener,intMinYear,intMinMonth,intMinDay,intMaxYear,intMaxMonth,intMaxDay);
}
when creating date picker pass the mindate and maxdate as per u r requirement for showing datepicker when button clicked or any other control put this code inside for that onclicklistener...
创建日期选择器时,根据您的要求,在单击按钮时显示日期选择器或任何其他控件将此代码放入该onclicklistener...
datePickerDialog.show();
回答by Sankar V
Found a cool way to set the min
and max
date for DatePickerDialog
. Works for All Android versions. Simply you need to return the DatePickerDialog
based on Android version
发现一个很酷的方式来设置min
和max
日期DatePickerDialog
。适用于所有 Android 版本。只需返回DatePickerDialog
基于 Android 版本的
protected Dialog onCreateDialog(int id)
{
switch ( id )
{
case DATE_DIALOG_ID:
DatePickerDialog dialog = null;
if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB )
{
dialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener()
{
@Override
public void onDateSet(DatePicker view, int selectedYear, int selectedMonth, int selectedDate)
{
mTextView.setText(selectedDate + "/" + selectedMonth + 1 + "/" + selectedYear);
}
}, year, month - 1, date);
Calendar currentDate = Calendar.getInstance();
dialog.getDatePicker().setMaxDate(currentDate.getTimeInMillis());
//If you need you can set min date too
}
else
{
dialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener()
{
@Override
public void onDateSet(DatePicker view, int selectedYear, int selectedMonth, int selectedDate)
{
mTextView.setText(selectedDate + "/" + selectedMonth + 1 + "/" + selectedYear);
}
}, year, month - 1, date)
{
@Override
public void onDateChanged(DatePicker view, int year, int month, int day)
{
if ( year <= maxYear && month + 1 <= maxMonth && date <= maxDate ) //meets your criteria
{
view.updateDate(year, month, date); //update the date picker to selected date
}
else
{
view.updateDate(maxYear, maxMonth - 1, maxDate); // or you update the date picker to previously selected date
}
}
};
}
return dialog;
}
return null;
}
回答by Douglas Anuncia??o
Edit your DatePicker.java adding the following 3 code excerpts.
编辑您的 DatePicker.java,添加以下 3 段代码摘录。
Declare the variables used for limiting the minimum and maximum date.
声明用于限制最小和最大日期的变量。
// Variables for defining minimum date
private int minimumDay;
private int minimumMonth;
private int minimumYear;
// Variables for defining maximum date
private int maximumDay;
private int maximumMonth;
private int maximumYear;
After the constructors, your have to override onDateChanged method.
在构造函数之后,您必须覆盖 onDateChanged 方法。
// Called every time the user changes DatePicker values
public void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// Test if chosen date is before minimum date
boolean beforeMinDate = false;
boolean afterMaxDate = false;
if(year < minimumYear){
beforeMinDate = true;
}
else if(year == minimumYear){
if(monthOfYear < minimumMonth){
beforeMinDate = true;
}
else if(monthOfYear == minimumMonth){
if(dayOfMonth < minimumDay){
beforeMinDate = true;
}
}
}
// Test if chosen date is after maximum date
if(!beforeMinDate){
if(year > maxYear){
afterMaxDate = true;
}
else if(year == maxYear){
if(monthOfYear > maxMonth){
afterMaxDate = true;
}
else if(monthOfYear == maxMonth){
if(dayOfMonth > maxDay){
afterMaxDate = true;
}
}
}
}
// If chosen date is before minimum date, update the date and internal
// calendar to minimum date, else, check similarly fot the maximum
// date, else, use the valid chosen date.
if(beforeMinDate)
{
mCalendar.set(minimumYear, minimumMonth, minimumDay,
mCalendar.get(Calendar.HOUR_OF_DAY),
mCalendar.get(Calendar.MINUTE));
updateDate(minimumYear, minimumMonth, minimumDay);
}
else if (afterMaxDate)
{
mCalendar.set(maximumYear, maximumMonth, maximumDay,
mCalendar.get(Calendar.HOUR_OF_DAY),
mCalendar.get(Calendar.MINUTE));
updateDate(maximumYear, maximumMonth, maximumDay);
}
else
mCalendar.set(year, monthOfYear, dayOfMonth,
mCalendar.get(Calendar.HOUR_OF_DAY),
mCalendar.get(Calendar.MINUTE));
}
And now, create setter methods for the minimum and maximum dates.
现在,为最小和最大日期创建 setter 方法。
// Method to define minimum permitted date for the picker.
public void setMinimumDate(int minimumDay, int minimumMonth,
int minimumYear)
{
this.minimumDay = minimumDay;
this.minimumMonth = minimumMonth;
this.minimumYear = minimumYear;
}
//Method to define maximum permitted date for the picker.
public void setMaximumDate(int maximumDay, int maximumMonth,
int maximumYear)
{
this.maximumDay = maximumDay;
this.maximumMonth = maximumMonth;
this.maximumYear = maximumYear;
}
Second part, in the activity you call the DatePicker dialog, you need to set the minimum and maximum desired dates. The code below sets the current date as minimum and two years in the future as the maximum date.
第二部分,在您调用 DatePicker 对话框的活动中,您需要设置所需的最小和最大日期。下面的代码将当前日期设置为最小日期,将未来两年的日期设置为最大日期。
// Define current date as the minimum desired date
Calendar c = Calendar.getInstance();
int currentDay = c.get(Calendar.DAY_OF_MONTH);
int currentMonth = c.get(Calendar.MONTH);
int currentYear = c.get(Calendar.YEAR);
inicioDateTimePicker.setMinimumDate(currentDay, currentMonth,
currentYear);
// Define two years in the future as the maximum desired date
Calendar c = Calendar.getInstance();
int currentDay = c.get(Calendar.DAY_OF_MONTH);
int currentMonth = c.get(Calendar.MONTH);
int currentYear = c.get(Calendar.YEAR);
inicioDateTimePicker.setMinimumDate(currentDay, currentMonth,
currentYear + 2);
回答by Ionut Negru
Based on @yostyle's answer, I've made a method which sets the minimum and maximum date for an DatePicker. My DatePicker was used inside an AlertDialog because I needed some extra customizations, but this method can be used directly on any DatePickerDialog or for any custom DatePicker's:
根据@yostyle 的回答,我创建了一个方法,可以为 DatePicker 设置最小和最大日期。我的 DatePicker 在 AlertDialog 中使用,因为我需要一些额外的自定义,但此方法可以直接用于任何 DatePickerDialog 或任何自定义 DatePicker:
/**
* Compat utility method that will set the minimum date and the maximum date for the DatePicker view.
* <p/>
* If the current API is greater than 11, than the normal {@link android.widget.DatePicker#setMinDate(long)} and
* {@link android.widget.DatePicker#setMaxDate(long)} methods will be used.
* <p/>
*
* @param minCalendar
* The minimum date for the picker
* @param maxCalendar
* The maximum date for the picker
*/
private void initDatePickerCompat(final Calendar minCalendar, final Calendar maxCalendar) {
if (null == mDatePicker) {
// Exit early if DatePicker view was not initialized
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// (mDatePicker is a DatePicker)
mDatePicker.setMinDate(minCalendar.getTimeInMillis());
mDatePicker.setMaxDate(maxCalendar.getTimeInMillis());
} else {
final int minYear = minCalendar.get(Calendar.YEAR);
final int minMonth = minCalendar.get(Calendar.MONTH);
final int minDay = minCalendar.get(Calendar.DAY_OF_MONTH);
final int maxYear = maxCalendar.get(Calendar.YEAR);
final int maxMonth = maxCalendar.get(Calendar.MONTH);
final int maxDay = maxCalendar.get(Calendar.DAY_OF_MONTH);
mDatePicker.init(minYear, minMonth, minDay, new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Calendar newCalendar = Calendar.getInstance();
newCalendar.set(year, monthOfYear, dayOfMonth);
if (newCalendar.after(maxCalendar)) {
// MAX
view.updateDate(maxYear, maxMonth, maxDay);
} else if (newCalendar.before(minCalendar)) {
// MIN
view.updateDate(minYear, minMonth, minDay);
} else {
// BETWEEN
view.updateDate(year, monthOfYear, dayOfMonth);
}
}
});
}
}
Keep in mind that this method should be called after DatePicker was initialized, like this:
请记住,此方法应在 DatePicker 初始化后调用,如下所示:
mDatePicker = (DatePicker) view.findViewById(R.id.datePicker);
mDatePicker.init(year, monthOfYear, dayOfMonth, this);
DateTime minDate = new DateTime();
DateTime maxDate = minDate.plusYears(10);
// Set the minimum and the maximum date for the date picker
initDatePickerCompat(minDate.toCalendar(Locale.getDefault()), maxDate.toCalendar(Locale.getDefault()));
回答by Thomas Dignan
You can't. The way I dealt with this was by using an if statement for the DatePicker:
你不能。我处理这个问题的方法是对 DatePicker 使用 if 语句:
import android.os.Build.*;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// (picker is a DatePicker)
picker.setMinDate(...);
} else {
Log.w(TAG, "API Level < 11 so not restricting date range...");
}
I ended up doing nothing for the TimePicker.
我最终没有为 TimePicker 做任何事情。
What's the good news?
好消息是什么?
SimonVT has backported both the DatePicker and TimePicker, so that you can enjoy the latest functionality on earlier API levels:
SimonVT 已向后移植 DatePicker 和 TimePicker,以便您可以享受早期 API 级别的最新功能:
回答by Mike Darwish
Just Use Value(Min & Max) Comes From Calender to set DatePiker.MaxDate & DatePiker.MinDate try some thing like :
只需使用来自日历的值(最小值和最大值)来设置 DatePiker.MaxDate 和 DatePiker.MinDate 尝试一些类似的事情:
DatePickerDialog dialog = new DatePickerDialog();
Java.Util.TimeZone GMT = new SimpleTimeZone(TimeZoneInfo.Local.BaseUtcOffset.Hours, "GMT");
Calendar maxDate = Calendar.GetInstance(GMT);
maxDate.Set(DateTime.Now.Year, DateTime.Now.Month - 1, DateTime.Now.Day);
Calendar minDate = Calendar.GetInstance(GMT);
minDate.Set(DateTime.Now.Year - 2, DateTime.Now.Month - 1, DateTime.Now.Day);
dialog.DatePicker.MaxDate = maxDate.TimeInMillis;
dialog.DatePicker.MinDate = minDate.TimeInMillis;