【问题标题】:Disable Sundays of every month in MaterialDateTimePicker在 MaterialDateTimePicker 中禁用每个月的星期日
【发布时间】:2016-05-16 07:23:38
【问题描述】:

我正在使用MaterialDateTimePicker。我想禁用每个月的特定工作日(如星期日)。它在post 中提到,我们可以使用这个库来做到这一点,但是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[] 数组中添加这个 switch case?
  • 如果有人知道如何使用日期选择器或自定义日历视图禁用星期日或任何其他工作日,请发表评论。

标签: android android-datepicker


【解决方案1】:

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

    // 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 个星期日。

【讨论】:

  • 嗨,我们从那里得到 setDisabledDays。请解释
【解决方案2】:

基于 Xavi Del Palacio 的回答,我创建了更具弹性的方法 在禁用日,您可以添加日历日,例如 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
        }
    }

【讨论】:

    【解决方案3】:

    回答可能会迟到我尝试了这个代码,它在我的星期天被禁用了

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 2013-05-15
      • 2016-01-26
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多