【问题标题】:Disable future date selection in date range picker in default google's material date range picker in android?在android中默认谷歌的材料日期范围选择器中禁用日期范围选择器中的未来日期选择?
【发布时间】:2020-05-09 14:01:51
【问题描述】:

我想选择过去日期到最大当前日期。在日期选择器的单个日期选择中有 setMinDate() 和 setMaxDate() 等方法。但是,我如何在 ma​​terial date range pickerdate range selection 中做到这一点?

【问题讨论】:

    标签: android datepicker material-design android-datepicker daterangepicker


    【解决方案1】:

    setMaxDate() 中设置您的当前日期

    还有 setMinDate() 你想显示的任何东西。

    【讨论】:

      【解决方案2】:
      class MainActivity : AppCompatActivity() {
      
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              setContentView(R.layout.activity_main)
      
              showRangePickerDialog()
      
          }
      
          private fun showRangePickerDialog() {
              val builderRange = MaterialDatePicker.Builder.dateRangePicker()
      
              builderRange.setCalendarConstraints(defineRange().build())
              val pickerRange = builderRange.build()
              pickerRange.show(supportFragmentManager, pickerRange.toString())
          }
      
      
          private fun defineRange(): CalendarConstraints.Builder {
      
              val constraintsBuilderRange = CalendarConstraints.Builder()
      
              val calendarStart: Calendar = GregorianCalendar.getInstance()
              val calendarEnd: Calendar = GregorianCalendar.getInstance()
      
              val year = 2020
      
              calendarStart.set(year, 1, 1)
              calendarEnd.set(year, 6, 30)
      
              val minDate = calendarStart.timeInMillis
              val maxDate = calendarEnd.timeInMillis
      
              constraintsBuilderRange.setStart(minDate)
              constraintsBuilderRange.setEnd(maxDate)
      
              constraintsBuilderRange.setValidator(RangeValidator(minDate, maxDate))
      
              return constraintsBuilderRange
                  }
      
          }
      
          class RangeValidator(private val minDate:Long, private val maxDate:Long) : CalendarConstraints.DateValidator{
      
      
          constructor(parcel: Parcel) : this(
              parcel.readLong(),
              parcel.readLong()
          )
      
          override fun writeToParcel(dest: Parcel?, flags: Int) {
          }
      
          override fun describeContents(): Int {
          }
      
          override fun isValid(date: Long): Boolean {
              return !(minDate > date || maxDate < date)
      
          }
      
          companion object CREATOR : Parcelable.Creator<RangeValidator> {
              override fun createFromParcel(parcel: Parcel): RangeValidator {
                  return RangeValidator(parcel)
              }
      
              override fun newArray(size: Int): Array<RangeValidator?> {
                  return arrayOfNulls(size)
              }
          }
      }
      

      尝试上面的代码,但必须根据您的要求对范围进行一些更改。

      【讨论】:

        【解决方案3】:

        只需在代码中添加这两行代码,就可以防止未来的日期选择。

        ma​​xDate: moment().subtract(0, 'days'), “本月”:[moment().startOf("month"), moment().subtract(0, 'days')],

            var rangesVal = {
              position: "inherit",
              drops: "down",
              maxDate: moment().subtract(0, 'days'),
              minDate: minDate,
              opens: "center",
              maxSpan: {
                months: 12,
              },
              ranges: {
                Today: [moment(), moment()],
                Yesterday: [moment().subtract(1, "days"), moment().subtract(1, "days")],
                "Last 7 Days": [moment().subtract(6, "days"), moment()],
                "Last 30 Days": [moment().subtract(29, "days"), moment()],
                "This Month": [moment().startOf("month"), moment().subtract(0, 'days')],
                "Last Month": [
                  moment().subtract(1, "month").startOf("month"),
                  moment().subtract(1, "month").endOf("month"),
                ],
              },
            };

        【讨论】:

          【解决方案4】:

          您必须使用 CalendarConstraints 来限制日期范围选择器中的最小和最大日期。

          val constraintsBuilderRange = CalendarConstraints.Builder()
          val dateValidatorMin: DateValidator = DateValidatorPointForward.from(millisOfMinimum)
          val dateValidatorMax: DateValidator = DateValidatorPointBackward.before(millisOfMaximum)
          
           val listValidators = ArrayList<DateValidator>()
           listValidators.add(dateValidatorMin)
           listValidators.add(dateValidatorMax)
           val validators = CompositeDateValidator.allOf(listValidators)
           constraintsBuilderRange.setValidator(validators)
          
          
           val datePicker = MaterialDatePicker.Builder.dateRangePicker()
                          .setTitleText("Select range")
                          .setCalendarConstraints(constraintsBuilderRange.build())
                          .build()
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-12
            • 1970-01-01
            • 2018-04-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多