簡體   English   中英

Android DatePickerDialog:設置最小和最大日期以供選擇

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM