Viv*_*P V 8 android datepicker android-datepicker material-components material-components-android
我有有一个自定义的线性布局DatePicker,并TimePicker在它的小部件。这用作DateTime选择器。我想通过setMaxDate()和来限制 DatePicker setMinDate()。我已经做好了:
dp.setMaxDate(new DateTime().minusDays(1).getMillis());
dp.setMinDate(new DateTime().minusDays(30).getMillis());
Run Code Online (Sandbox Code Playgroud)
当对话框出现时,超出此范围的日期实际上是灰色的。但我仍然可以选择一个灰色的日期。我偶然发现了这一点。但是,带有日期选择器的自定义布局的解决方法是什么?
use*_*158 11
对于未来的读者!
实际上,使用新的android 材料设计组件可以使用MaterialDatePicker. 并且超出允许范围的日期是不可选择的。
脚步
1. 在你的模块的 gradle 文件中添加材料依赖
implementation 'com.google.android.material:material:1.1.0-beta01'
Run Code Online (Sandbox Code Playgroud)
2. 更改应用主题以继承某个版本的材料主题。
前任:
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
Run Code Online (Sandbox Code Playgroud)
3. 使用以下代码启动对话框。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setupRangePickerDialog()
}
private fun setupRangePickerDialog() {
val builderRange = MaterialDatePicker.Builder.dateRangePicker()
builderRange.setCalendarConstraints(limitRange().build())
val pickerRange = builderRange.build()
pickerRange.show(supportFragmentManager, pickerRange.toString())
}
/*
Limit selectable range to Oct 17 - Nov 20 2019
*/
private fun limitRange(): CalendarConstraints.Builder {
val constraintsBuilderRange = CalendarConstraints.Builder()
val calendarStart: Calendar = GregorianCalendar.getInstance()
val calendarEnd: Calendar = GregorianCalendar.getInstance()
val year = 2019
calendarStart.set(year, 10, 17)
calendarEnd.set(year, 11, 20)
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) {
TODO("not implemented")
}
override fun describeContents(): Int {
TODO("not implemented")
}
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
材料组件库提供了MaterialDatePicker.
您可以使用 aDateValidator来限制选择。
特别是您可以使用内置验证器:
DateValidatorPointForward 启用从给定点向前的日期DateValidatorPointBackward 仅启用给定点之前的日期。就像是:
MaterialDatePicker.Builder<Pair<Long, Long>> builderRange = MaterialDatePicker.Builder.dateRangePicker();
CalendarConstraints.Builder constraintsBuilderRange = new CalendarConstraints.Builder();
//....define min and max for example with LocalDateTime and ZonedDateTime or Calendar
CalendarConstraints.DateValidator dateValidatorMin = DateValidatorPointForward.from(min.getTimeInMillis());
CalendarConstraints.DateValidator dateValidatorMax = DateValidatorPointBackward.before(max.getTimeInMillis());
ArrayList<CalendarConstraints.DateValidator> listValidators =
new ArrayList<CalendarConstraints.DateValidator>();
listValidators.add(dateValidatorMin);
listValidators.add(dateValidatorMax);
CalendarConstraints.DateValidator validators = CompositeDateValidator.allOf(listValidators);
constraintsBuilderRange.setValidator(validators);
builderRange.setCalendarConstraints(constraintsBuilderRange.build());
MaterialDatePicker<Pair<Long, Long>> pickerRange = builderRange.build();
pickerRange.show(getSupportFragmentManager(), pickerRange.toString());
Run Code Online (Sandbox Code Playgroud)
如果有人想要 RangeValidator (上面发布)但代码较少:(添加了 @Parcelize 注释)
@Parcelize
internal class RangeValidator(
private var minDate: Long = 0,
private var maxDate: Long = 0) : DateValidator {
override fun isValid(date: Long): Boolean {
return !(minDate > date || maxDate < date)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6281 次 |
| 最近记录: |