[英]How to set Min and Max date on DatePickerDialog.OnDateSetListener
[英]Android DatePickerDialog: Set min and max date for selection
我知道對此有很多問題,但沒有一個解決方案對我有用,所以這個問題。 我想將用戶限制為今天之前的 select 日期,但我無法這樣做。
public class DatePickerDialogFragment extends DialogFragment {
private OnDateSetListener listener;
public void setListener(OnDateSetListener listener) {
this.listener = listener;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(getContext(), listener, year, month, day);
dialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
return dialog;
}
}
我將其顯示為:
DatePickerDialogFragment fragment = new DatePickerDialogFragment();
fragment.setListener(dateSetListener);
fragment.show(getSupportFragmentManager(), "Choose booking date");
我希望用戶在今天之前不應該能夠 select 日期。 正如你所看到的,我用今天的時間調用setMinDate()
方法,但它沒有效果。 該對話框將今天之前的日期顯示為灰色但可選擇。
我還嘗試按照一些stackoverflow答案中的建議對DatePickerDialog
進行子類化並覆蓋onDateChanged
,但沒有任何成功。
試試這個方法
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(getContext(), listener, year, month, day);
Field mDatePickerField;
try {
mDatePickerField = dialog.getClass().getDeclaredField("mDatePicker");
mDatePickerField.setAccessible(true);
} catch (Exception e) {
e.printStackTrace();
}
dialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
return dialog;
}
而不是你的
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(getContext(), listener, year, month, day);
dialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
return dialog;
}
編輯1:
我也遇到過這個問題,用戶可以在Android L 5.0.2
選擇不可選擇的日期。 目前這里報告了錯誤。 它已在Android L 5.1.0
解決。
對於此問題的臨時解決方案,您可以將所選日期與當前系統日期進行比較,並根據此設置一些條件。 我用它作為我的解決方法
編輯2:
在DatePickerDialogFragment
添加onDateSent()
方法,然后檢查它是否早於您在setMinDate()
設置的日期。 如果是這樣,那么只需再次顯示DatePickerDialog
。
final long today = System.currentTimeMillis() - 1000;
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, monthOfYear, dayOfMonth);
//If user tries to select date in past (or today)
if (calendar.getTimeInMillis() < today)
{
//Make them try again
DatePickerDialogFragment fragment = new DatePickerDialogFragment();
fragment.setListener(dateSetListener);
fragment.show(getSupportFragmentManager(), "Choose booking date");
Toast.makeText(this, "Invalid date, please try again", Toast.LENGTH_LONG).show();
}
else
{
//success
}
}
獲取系統時間並從中減去 1 秒
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
dialog = new DatePickerDialog(act, listener, year, month, day);
dialog.getDatePicker().setMinDate(System.currentTimeMillis() -1000);
return dialog;
}
dialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
以上 API 11 對於最小日期,您可以使用
android:minDate="mm/dd/yyyy"
或setMinDate(long time)
For Max date
android:maxDate="mm/dd/yyyy"
// 在 XML 中
setMaxDate(new Date().getTime());
// 當前時間
我使用該方法將最小日期設置為當前年份,即2020-05-20
如下所示
datePickerDialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
單擊日期選擇器的那一刻,它會顯示 2020 年作為最小年份
我希望答案有幫助。
在 XML 文件中
<DatePicker
android:minDate="mm/dd/yyyy"
android:maxDate="mm/dd/yyyy" >
前任:
android:minDate="10/12/2000"
android:maxDate="10/12/2000"
Android DatePickerDialog:設置選擇的最小和最大日期以顯示 2022 年 8 月 16 日至 30 日的允許日期。
// Month is 0 based for Calendar.
final Calendar cMax = Calendar.getInstance();
// CMax.set(mYear, mMonth-1, mDay)
cMax.set(2022,7,30); // for date 30/Aug/2022
XXDatePicker.setMaxDate(cMax.getTimeInMillis());
final Calendar cMin = Calendar.getInstance();
// CMin.set(mYear, mMonth-1, mDay)
cMin.set(2022,7,16); // for date 16/Aug/2022
XXDatePicker.setMinDate(cMin.getTimeInMillis());
mdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Calendar calendar = Calendar.getInstance();
//set time zone
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
int selectedYear = calendar.get(Calendar.YEAR);
int selectedMonth = calendar.get(Calendar.MONTH);
int selectedDay = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog datePickerDialog = new DatePickerDialog(BrandResturant_DetailActivity.this,
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int selectedYear,
int selectedMonth, int selectedDay) {
mDay = selectedDay;
mMonth = selectedMonth;
mYear = selectedYear;
StringBuilder Date = new StringBuilder("");
String conver = Integer.toString(selectedYear);
Date.append(conver);
Date.append("-");
selectedMonth++;
conver = Integer.toString(selectedMonth);
Date.append(conver);
Date.append("-");
conver = Integer.toString(selectedDay);
Date.append(conver);
isDob = true;
}
}, mDay, mMonth, mYear);
datePickerDialog.getDatePicker().setMaxDate(calendar.getTimeInMillis());
//Getting Today date to calendar2
final Calendar calendar2 = Calendar.getInstance();
//Set Minimum date of calendar
calendar2.set(2021, 1, 3);
datePickerDialog.getDatePicker().setMinDate(calendar2.getTimeInMillis());
datePickerDialog.setTitle("Select Date");
datePickerDialog.show();
//Getting Today date to calendar3
final Calendar calendar3 = Calendar.getInstance();
//Set Maximum date of calendar - Method 1
calendar3.set(2021, 3, 3);
//Set Maximum One Month date from today(calendar3) date to calendar -Method 2
//In Place of month u can also set year, day
//calendar3.add(Calendar.MONTH, 1);
datePickerDialog.getDatePicker().setMaxDate(calendar3.getTimeInMillis());
datePickerDialog.setTitle("Select Date");
datePickerDialog.show();
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.