2016-05-16 110 views
2

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

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

+0

检查此参考:http://stackoverflow.com/questions/14118894/how-to-get-day-from-specified-date-in-android –

+0

感谢您的快速回复。如何在Calendar []数组中添加此开关盒? –

+0

如果有人知道如何禁用星期日或任何其他星期几使用datepicker或自定义日历视图,请评论。 –

回答

7

它也许有点晚了这个答案,但我已经有了一个解决方案,它可以帮助别人。请尝试以下方法:

// Calendar saturday; 
    Calendar sunday; 
    List<Calendar> weekends = new ArrayList<>(); 
    int weeks = 5; 

    for (int i = 0; i < (weeks * 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日,如果你想这样做的时间比较长,只需要修改的一周。如果您希望禁用星期六,只需取消注释这些行。

如果你想这样做,对过去5日的话,只需要修改for循环:

for (int i = 0; i < (weeks * 7); i = i + 7) { 
    for(int j =0; j > (weeks*7) ; j = j - 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); 
    } 

所以这第二个for循环将用于禁用前5日。

+0

嗨, 从那里我们得到setDisabledDays。请解释一下 –

0

这可能是答案迟到我想这码的禁用我的星期天

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

基于哈维德尔帕拉西奥答案,我创造了更多的弹性方法 在禁用的日子里,你添加日历天像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 
     } 
    } 
相关问题