在Android日期选择器中禁用特定日期

Emy*_*agh 15 android datepicker

我正在使用datePicker,我可以通过以下代码禁用今天的最后几天和30天后的后几天:

DatePickerDialog datePicker = new DatePickerDialog();

             Calendar calender = Calendar.getInstance();
             long today = calender.getTimeInMillis();
             final long oneDay = 24 * 60 * 60 * 1000L;

             Date previousDays = new Date(today - 1000);
             datePicker.setMinDate(DateToCalendar(previousDays));

             Date nextMonth = new Date(today + 30 * oneDay);
             datePicker.setMaxDate(DateToCalendar(nextMonth));
Run Code Online (Sandbox Code Playgroud)

如果我想每个月的星期五禁用,我该怎么办呢?

him*_*496 12

您可以使用此库材料日期时间选择器,您可以在此处设置显示特定日期的选项,例如:

datePicker.setSelectableDays(Calendar[] days)
Run Code Online (Sandbox Code Playgroud)

并传递数组Calendar作为包含所有可选日期的参数.

  • 非常感谢,这很有效.我不知道为什么标准的android这么有限. (3认同)

aka*_* bs 7

使用自定义 DatePickerDialog

在 build.gradle 中添加这个

编译 'com.wdullaer:materialdatetimepicker:3.5.1'

实施

DatePickerDialog.OnDateSetListener 到您的班级

和进口

导入 com.wdullaer.materialdatetimepicker.date.DatePickerDialog; 而不是 'import android.app.DatePickerDialog;'

并添加此方法

 private void showDatePicker() { 

    Calendar calendar = Calendar.getInstance();

    DatePickerDialog dpd = DatePickerDialog.newInstance(
            this,
            calendar.get(Calendar.YEAR),
            calendar.get(Calendar.MONTH),
            calendar.get(Calendar.DAY_OF_MONTH)
    );
    dpd.show(getActivity().getFragmentManager(), "DatePickerDialog");

    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
    String a = "07-03-2018"; // example

    java.util.Date date = null;

    try {
        date = sdf.parse(a);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    calendar = dateToCalendar(date);
    System.out.println(calendar.getTime());

    List<Calendar> dates = new ArrayList<>();
    dates.add(calendar);
    Calendar[] disabledDays1 = dates.toArray(new Calendar[dates.size()]);
    dpd.setDisabledDays(disabledDays1);

}

    private Calendar dateToCalendar(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar;
    }




@Override
public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {

    String date = dayOfMonth+"/"+(monthOfYear+1)+"/"+year;
    textview.setText(date);

}
Run Code Online (Sandbox Code Playgroud)

调用 showDatePicker()。

多日

改变这个

     String[] holidays = {"07-03-2018","05-03-2018","10-03-2018"};

    java.util.Date date = null;

    for (int i = 0;i < holidays.length; i++) {

        try {
            date = sdf.parse(holidays[i]);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        calendar = dateToCalendar(date);
        System.out.println(calendar.getTime());

        List<Calendar> dates = new ArrayList<>();
        dates.add(calendar);
        Calendar[] disabledDays1 = dates.toArray(new Calendar[dates.size()]);
        dpd.setDisabledDays(disabledDays1);
    }
Run Code Online (Sandbox Code Playgroud)


Pat*_*ang 7

由于此处接受的答案依赖于 com.wdullaer 的自定义实现,因此我想提出另一个解决方案,我刚刚使用标准 MaterialDatePicker 和自定义 DateValidator 实现了该解决方案:

            // Create a custom date validator to only enable dates that are in the list
        val customDateValidator = object: CalendarConstraints.DateValidator {
            override fun describeContents(): Int {  return 0  }
            override fun writeToParcel(dest: Parcel?, flags: Int) {    }
            override fun isValid(date: Long): Boolean {

                listOfPossibleDatesAsLong.forEach {
                    val itemDateTime = Calendar.getInstance()
                    itemDateTime.timeInMillis = it

                    val dateDateTime = Calendar.getInstance()
                    dateDateTime.timeInMillis = date

                    if(itemDateTime.get(Calendar.YEAR) == dateDateTime.get(Calendar.YEAR)
                        && itemDateTime.get(Calendar.MONTH) == dateDateTime.get(Calendar.MONTH)
                        && itemDateTime.get(Calendar.DAY_OF_MONTH) == dateDateTime.get(Calendar.DAY_OF_MONTH))
                        return true
                }
                return false
            }
        }
Run Code Online (Sandbox Code Playgroud)

除了 CalendarConstraints 中的其他约束之外,现在只需设置 customDateValidator,这也可以与 setStart(...) 和 setEnd(...) 一起使用

        // Build constraints.
        val constraintsBuilder =
            CalendarConstraints.Builder().apply {
                    // other constraints
                    setValidator(customDateValidator)
                }
            }
Run Code Online (Sandbox Code Playgroud)

然后定义datePicker并显示

        val datePicker =
            MaterialDatePicker.Builder.datePicker()
                .setTitleText("Select date")
                .setSelection(MaterialDatePicker.todayInUtcMilliseconds())
                .setCalendarConstraints(constraintsBuilder.build())
                .build()

        datePicker.addOnPositiveButtonClickListener {
            // Respond to positive button click...
        }

        datePicker.show(parentFragmentManager, "tag")
Run Code Online (Sandbox Code Playgroud)

我需要承认,我不明白如果describeContents和writeToParcel没有正确实现会对任何事情产生负面影响,也许可以在这里讨论。然而,就我的目的而言,这非常有效。


aen*_*hik 5

这对于 Android 日期选择器来说是不可能的,您需要为自己创建一个自定义选择器。请参阅材质日期时间选择器

要禁用星期日,您必须像这样传递数组

      GregorianCalendar g1=new GregorianCalendar();
      g1.add(Calendar.DATE, 1);
      GregorianCalendar gc = new GregorianCalendar();
      gc.add(Calendar.DAY_OF_MONTH, 30);
       List<Calendar> dayslist= new LinkedList<Calendar>();
Calendar[] daysArray;
Calendar cAux = Calendar.getInstance();
while ( cAux.getTimeInMillis() <= gc.getTimeInMillis()) {
    if (cAux.get(Calendar.DAY_OF_WEEK) != 1) {
        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(cAux.getTimeInMillis());
        dayslist.add(c);
    }
    cAux.setTimeInMillis(cAux.getTimeInMillis() + (24*60*60*1000));
}
daysArray = new Calendar[dayslist.size()];
for (int i = 0; i<daysArray.length;i++)
{
    daysArray[i]=dayslist.get(i);
}
datePickerDialog.setSelectableDays(daysArray);
Run Code Online (Sandbox Code Playgroud)

  • 使用 Calendar.SUNDAY 而不是 1 (4认同)