在MaterialDateTimePicker中禁用每个月的星期日

我正在使用MaterialDateTimePicker 。 我想禁用每个月的特定周日(如星期天)。 它在这篇文章中提到,我们可以使用这个库,但how to disable particular weekdays? 我当然可以限制使用短代码的月份数量,但我不想限制月份的数量,只是从选择禁用平日。

 public class MainActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener { private TextView dateTextView; private CheckBox modeDarkDate; private CheckBox vibrateDate; private CheckBox dismissDate; private CheckBox limitDates; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Find our View instances dateTextView = (TextView)findViewById(R.id.date_textview); Button dateButton = (Button)findViewById(R.id.date_button); modeDarkDate = (CheckBox)findViewById(R.id.mode_dark_date); vibrateDate = (CheckBox) findViewById(R.id.vibrate_date); dismissDate = (CheckBox) findViewById(R.id.dismiss_date); limitDates = (CheckBox) findViewById(R.id.limit_dates); // check if picker mode is specified in Style.xml modeDarkDate.setChecked(Utils.isDarkTheme(this, modeDarkDate.isChecked())); // Show a datepicker when the dateButton is clicked dateButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Calendar now = Calendar.getInstance(); DatePickerDialog dpd = DatePickerDialog.newInstance( MainActivity.this, now.get(Calendar.YEAR), now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH) ); dpd.setThemeDark(modeDarkDate.isChecked()); dpd.vibrate(vibrateDate.isChecked()); dpd.dismissOnPause(dismissDate.isChecked()); if (limitDates.isChecked()) { /* Calendar[] dates = new Calendar[13]; for(int i = -6; i <= 6; i++) { Calendar date = Calendar.getInstance(); date.add(Calendar.MONTH, i); dates[i+6] = date; } */ // Add code here to disbale weekdays like Sundays. // dpd.setSelectableDays(dates); } dpd.show(getFragmentManager(), "Datepickerdialog"); } }); } @Override public void onResume() { super.onResume(); DatePickerDialog dpd = (DatePickerDialog) getFragmentManager().findFragmentByTag("Datepickerdialog"); if(dpd != null) dpd.setOnDateSetListener(this); } @Override public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) { String date = "You picked the following date: "+dayOfMonth+"/"+(++monthOfYear)+"/"+year; dateTextView.setText(date); } } 

这个答案可能有点晚了,但我有一个可以帮助别人的解决方案。 请尝试以下操作:

  // Calendar saturday; Calendar sunday; List<Calendar> weekends = new ArrayList<>(); int weeks = 5; for (int i = 0; i < (week * 7) ; i = i + 7) { sunday = Calendar.getInstance(); sunday.add(Calendar.DAY_OF_YEAR, (Calendar.SUNDAY - sunday.get(Calendar.DAY_OF_WEEK) + 7 + i)); // saturday = Calendar.getInstance(); // saturday.add(Calendar.DAY_OF_YEAR, (Calendar.SATURDAY - saturday.get(Calendar.DAY_OF_WEEK) + i)); // weekends.add(saturday); weekends.add(sunday); } Calendar[] disabledDays = weekends.toArray(new Calendar[weekends.size()]); dpd.setDisabledDays(disabledDays); 

此代码将禁用接下来的5个星期天,如果您想要更长的时间,只需要修改一周。 如果您希望禁用星期六,只需取消注释这些行。

这可能是迟到的答案我试着这个代码禁用我的星期天

  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); 

基于哈维德尔帕拉西奥答案我创建了更多的弹性方法在残疾的日子,你添加日历天如disabledDays.add(Calendar.MONDAY)

对不起,关于使用kotlin而不是java,只是想给一个想法如何返工这个方法更容易使用

 private fun disableDatesFor4Weeks(disabledDays: ArrayList<Int>) { val disabledDaysInWeeks = ArrayList<Calendar>() disabledDays.forEach { dayInt -> var day: Calendar val weeks = 4 var week = 0 var i = 0 while (week < weeks * 7) { day = Calendar.getInstance() day.add(Calendar.DAY_OF_YEAR, dayInt - day.get(Calendar.DAY_OF_WEEK) + 7 * i) disabledDaysInWeeks.add(day) i += 1 week += 7 } } if (disabledDaysInWeeks.size > 0) { val disabledDaysInWeeksTypedArray = disabledDaysInWeeks.toTypedArray() datePickerDialog!!.maxDate = disabledDaysInWeeksTypedArray.last() datePickerDialog!!.disabledDays = disabledDaysInWeeksTypedArray } }