如何限制DatePickerDialog选择过去2 - 12年或当前日期0 - 2年的日期?
我在活动中有DatePickerDialog,用于获取儿童和婴儿的出生日期。儿童年龄为(2-12岁),婴儿年龄为(0-2岁)。如果我通过1,那么年龄限制应该是(2-12岁),如果我通过2岁,年龄限制应该是(0-2岁)。
如何在我的日历中获得此功能?
我的日历代码是:
date = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, monthOfYear);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
String myFormat = "dd/MM/yy"; //In which you need put here
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
dateofBirth.setText(sdf.format(myCalendar.getTime()));
}
};
dateofBirth.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showDialog(DATE_DIALOG_ID);
}
});
public Dialog onCreateDialog(int id) {
final Calendar now = Calendar.getInstance();
switch (id) {
case DATE_DIALOG_ID:
// set date picker as current date
DatePickerDialog _date = new DatePickerDialog(this, date,myCalendar
.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH)){
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth){
if (year > now.get(Calendar.YEAR))
view.updateDate(myCalendar
.get(Calendar.YEAR), myCalendar
.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
if (monthOfYear > now.get(Calendar.MONTH) && year == now.get(Calendar.YEAR))
view.updateDate(myCalendar
.get(Calendar.YEAR), myCalendar
.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
if (dayOfMonth > now.get(Calendar.DAY_OF_MONTH) && year == now.get(Calendar.YEAR) &&
monthOfYear == now.get(Calendar.MONTH))
view.updateDate(myCalendar
.get(Calendar.YEAR), myCalendar
.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
}
};
return _date;
}
return null;
}
答案 0 :(得分:163)
所有其他答案似乎相当复杂,所以我只是说明显而易见:您可以从DatePicker
获取基础DatePickerDialog
(只需致电getDatePicker()
)并使用:
其中参数是自默认时区1970年1月1日1970:00 00:00:00以来的通常毫秒数。您当然还需要计算这些值,但这对于Calendar
类来说应该是微不足道的:只需要使用当前日期并添加或减去x
年。
更细心的读者会注意到,在API级别11之前,前面提到的setter是不可用的。如果您只针对那个(或更新的)平台,那么您就可以了。如果你也想支持姜饼设备(Android 2.3 / API等级9+),你可以使用backported version of DatePicker
代替。
答案 1 :(得分:2)
设置DatePickerDialog的最小值和最大日期是不够的。用户可以点击年份并在年份之间滚动。
您还应该在DatePicker上设置年份范围,如下所示:
datePicker.setYearRange(calendar.get(Calendar.YEAR), calendar.get(Calendar.YEAR) + 1);
答案 2 :(得分:1)
我无法为您提供工作代码,因为我正在巡视,无法访问我的电脑。但我可以给你一个实现目标的方法(或者我认为)。
我不确定这是否会完美,但任何方式都值得一试。
请尝试使用此代码并通知我。
“DatepickerType”是该类的Integer公共成员变量。
private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() {
// when dialog box is closed, below method will be called.
public void onDateSet(DatePicker view, int selectedYear,
int selectedMonth, int selectedDay) {
int y = Calendar.getInstance().get(Calendar.YEAR);
switch(DatepickerType){
case 1:
if(selectedYear>(y-2)){
//Add message if you want
selectedYear = y-2;
}
else if(selectedYear<(y-12)) {
//Add msg if u want
selectedYear = y-12;
}
case 2:
if(selectedYear>(y)){
//Add message if you want
selectedYear = y;
}
else if(selectedYear<(y-2)) {
//Add msg if u want
selectedYear = y-2;
}
}
String year1 = String.valueOf(selectedYear);
String month1 = String.valueOf(selectedMonth+1);
String day1 = String.valueOf(selectedDay);
//do what you need
setLastStatus();
}
};
答案 3 :(得分:1)
愿这对你有所帮助。最好使用对话框片段,因为不建议使用Dialog的showDialog()
。
另请注意,它仅适用于高于11的API。因此,将清单中的min.sdk
更改为11。
Calendar calendar=Calendar.getInstance();
int mDay = calendar.get(Calendar.DAY_OF_MONTH), mMonth = calendar.get(Calendar.MONTH), mYear = calendar.get(Calendar.YEAR);
int minDay = calendar.get(Calendar.DAY_OF_MONTH), minMonth = calendar.get(Calendar.MONTH), minYear = calendar.get(Calendar.YEAR)-12;
int maxDay = calendar.get(Calendar.DAY_OF_MONTH), maxMonth = calendar.get(Calendar.MONTH), maxYear = calendar.get(Calendar.YEAR)-12;
public void onDate(View view) {
System.out.println("hello");
DialogFragment fragment = new SelectDateFragment();
fragment.show(getFragmentManager(), "Date Picker");
}
class SelectDateFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener {
public Dialog onCreateDialog(Bundle savedInstanceState) {
System.out.println("entrering on create dialog");;
return new DatePickerDialog(getActivity(), this, mYear, mMonth,
mDay) {
public void onDateChanged(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
System.out.println("----------onDateChanged()-----------"
+ year + "--" + year);
System.out.println("----------onDateChanged()-----------"
+ monthOfYear + "--" + monthOfYear);
System.out.println("----------onDateChanged()-----------"
+ dayOfMonth + "--" + dayOfMonth);
if ((minYear < year)
|| ((minMonth < monthOfYear) && (minYear == year))
|| ((minDay < dayOfMonth) && (minYear == year) && (minMonth == monthOfYear))) {
view.updateDate(minYear, minMonth - 1, minDay);
}
if ((maxYear > year)
|| ((maxMonth > monthOfYear) && (maxYear == year))
|| ((maxDay > dayOfMonth) && (maxYear == year) && (maxMonth == monthOfYear))) {
view.updateDate(maxYear, maxMonth - 1, maxDay);
}
}
};
}
@Override
public void onDateSet(android.widget.DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
System.out.println("year=" + year + "day=" + dayOfMonth + "month="
+ monthOfYear);
mYear=year;
mMonth=monthOfYear;
mDay=dayOfMonth;
onPopulateSet(year, monthOfYear + 1, dayOfMonth);
}
private void onPopulateSet(int year, int i, int dayOfMonth) {
EditText et_setDate;
et_setDate = (EditText) findViewById(R.id.register_et_dob);
et_setDate.setText(dayOfMonth + "/" + i + "/" + year);
System.out.println("enetring on populate Set");
}
}
答案 4 :(得分:0)
datePickerDialog = new CustomDatePickerDialog(this,
new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
// TODO Auto-generated method stub
try {
Log.i("DAta SEt", "data set");
} catch (Exception e) {
}
}
}, minYear, minMonth, minDay, maxYear, maxMonth, maxDay);
CustomDatePickerDialog:
public class CustomDatePickerDialog extends DatePickerDialog {
private boolean mIgnoreEvent = false, mignorsunday = true;
public static int mYear, mMonth, mDate, maxYear, maxMonth, maxDay, minYear,
minMonth, minDay;
public static int dateflag = 0;
public static int dateflag2 = 0;
public CustomDatePickerDialog(Context context, OnDateSetListener callBack,
int year, int monthOfYear, int dayOfMonth, int maxYear,
int maxMonth, int maxDay) {
super(context, callBack, year, monthOfYear, dayOfMonth);
// TODO Auto-generated constructor stub
dateflag = 0;
dateflag2 = 1;
mYear = year;
mMonth = monthOfYear;
mDate = dayOfMonth;
Log.i("Hello World ::", "Please Its Updating At Every time");
this.maxYear = maxYear;
this.maxMonth = maxMonth;
this.maxDay = maxDay;
this.minYear = year;
this.minMonth = monthOfYear;
this.minDay = dayOfMonth;
// setTitle("בחרו מתי נח לכם שנתקשר");
setTitle("We Call U...בחרו מתי נוח לכם ש");
}
@Override
public void onDateChanged(DatePicker view, int year, int month, int day) {
// TODO Auto-generated method stub
super.onDateChanged(view, year, month, day);
dateflag = 1;
dateflag2 = 1;
if (!mIgnoreEvent) {
mIgnoreEvent = true;
if (year > maxYear || month > maxMonth && year == maxYear
|| day > maxDay && year == maxYear && month == maxMonth) {
mYear = maxYear;
mMonth = maxMonth;
mDate = maxDay;
view.updateDate(maxYear, maxMonth, maxDay);
} else if (year < minYear || month < minMonth && year == minYear
|| day < minDay && year == minYear && month == minMonth) {
mYear = minYear;
mMonth = minMonth;
mDate = minDay;
view.updateDate(minYear, minMonth, minDay);
} else {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month);
cal.set(Calendar.DATE, day);
if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
if (mignorsunday) {
cal.add(Calendar.DATE, 1);
mYear = cal.get(Calendar.YEAR);
mMonth = cal.get(Calendar.MONTH);
mDate = cal.get(Calendar.DATE);
mignorsunday = false;
} else if (!mignorsunday) {
mignorsunday = true;
cal.add(Calendar.DATE, -1);
mYear = cal.get(Calendar.YEAR);
mMonth = cal.get(Calendar.MONTH);
mDate = cal.get(Calendar.DATE);
}
} else {
mYear = year;
mMonth = month;
mDate = day;
}
view.updateDate(mYear, mMonth, mDate);
}
setTitle("We Call U...בחרו מתי נוח לכם ש");
mIgnoreEvent = false;
}
}
public int getSelectedYear() {
return mYear;
}
public int getSelectedMonth() {
return mMonth;
}
public int getSelectedDate() {
return mDate;
}
}
答案 5 :(得分:0)
以下是工作代码,您必须根据代码进行一些更改。就像你可以为孩子和婴儿增加最小和最大年龄。
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
/*
* mYear = year;
* mMonth = monthOfYear;
* mDay = dayOfMonth;
*/
if (year > maxYear || monthOfYear > maxMonth && year == maxYear ||
dayOfMonth > maxDay && year == maxYear && monthOfYear == maxMonth) {
view.updateDate(maxYear, maxMonth, maxDay);
//you can add toast message here for max year selection
} else if (year < minYear || monthOfYear < minMonth && year == minYear ||
dayOfMonth < minDay && year == minYear && monthOfYear == minMonth) {
view.updateDate(minYear, minMonth, minDay);
//you can add toast message here for min year selection
} else {
view.updateDate(year, monthOfYear, dayOfMonth);
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mPickDate = (Button) findViewById(R.id.pickDate);
mPickDate.setOnClickListener(this);
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
maxYear = mYear - 2;//make a proper condition to change it the based on the child/infant
maxMonth = mMonth;
maxDay = mDay;
minYear = mYear - 12;//make a proper condition to change it the based on the child/infant
minMonth = mMonth;
minDay = mDay;
}
@Override
public void onClick(View v) {
showDialog(DATE_DIALOG_ID);
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this, mDateSetListener, mYear - minYear,
mMonth, mDay);
}
return null;
}
答案 6 :(得分:0)
val cal = Calendar.getInstance()
todayDay = cal.get(Calendar.DAY_OF_MONTH)
todayMonth = cal.get(Calendar.MONTH)
todayYear = cal.get(Calendar.YEAR)
todayHour = cal.get(Calendar.HOUR)
todayMin = cal.get(Calendar.MINUTE)
val dpd = DatePickerDialog(this, DatePickerDialog.OnDateSetListener { it, selectedYear, selectedMonth, selectedDay ->
dateDisplay.isVisible = true
val selectedDate = "$selectedDay/${selectedMonth + 1}/$selectedYear"
//Implementing SimpleDateFormat
val sdf = SimpleDateFormat("dd/mm/yyyy", Locale.ENGLISH)
val formatedDate = sdf.parse(selectedDate)
//this variable is of type Date
val selectedTime = formatedDate!!.time / 60000
val todayDate = sdf.parse(sdf.format(System.currentTimeMillis()))
val todayTime = todayDate!!.time / 60000
dateDisplay.text = formatedDate.toString()
ageInMins.text = (todayTime - selectedTime).toString()
}, todayYear, todayMonth, todayDay)
dpd.datePicker.setMaxDate(Date().time - 86400000)
dpd.datePicker.setBackgroundColor(Color.RED)
dpd.show()