I'm trying to get the values from DatePicker, but I've no idea how could I manage it.
My layout contains a DatePicker element, and I'm using kotlin.
Same problem with TimePicker.
Thanks for Márton Soós
This helper class does the magic for both DatePicker and TimePicker:
data class DatePickerChangeEvent(
val view: View,
val year: Int = 0,
val monthOfYear: Int = 0,
val dayOfMonth: Int = 0
)
data class TimePickerChangeEvent(
val view: View,
val hour: Int,
val minute: Int
)
class DatePickerObservable(val view: DatePicker, val year: Int, val monthOfYear: Int, val dayOfMonth: Int)
: io.reactivex.Observable<DatePickerChangeEvent>() {
override fun subscribeActual(observer: Observer<in DatePickerChangeEvent>) {
val listener = DateChangeListener(view, observer)
observer.onSubscribe(listener)
view.init(year, monthOfYear, dayOfMonth, listener)
}
class DateChangeListener(private val dp: DatePicker, private val obs: io.reactivex.Observer<in DatePickerChangeEvent>)
: DatePicker.OnDateChangedListener, MainThreadDisposable() {
override fun onDateChanged(p0: DatePicker, p1: Int, p2: Int, p3: Int) {
obs.onNext(DatePickerChangeEvent(dp, p1, p2, p3))
}
override fun onDispose() {
}
}
}
class TimePickerObservable(val view: TimePicker)
: io.reactivex.Observable<TimePickerChangeEvent>() {
override fun subscribeActual(observer: Observer<in TimePickerChangeEvent>) {
val listener = TimeChangeListener(view, observer)
observer.onSubscribe(listener)
view.setOnTimeChangedListener(listener)
}
class TimeChangeListener(private val tp: TimePicker, private val obs: io.reactivex.Observer<in TimePickerChangeEvent>)
: TimePicker.OnTimeChangedListener, MainThreadDisposable() {
override fun onTimeChanged(p0: TimePicker, p1: Int, p2: Int) {
obs.onNext(TimePickerChangeEvent(p0, p1, p2))
}
override fun onDispose() {
tp.setOnTimeChangedListener { timePicker, i, i2 -> }
}
}
}
@Suppress("NOTHING_TO_INLINE")
inline fun DatePicker.dateChange(year: Int, monthOfYear: Int, dayOfMonth: Int): DatePickerObservable =
DatePickerObservable(this, year, monthOfYear, dayOfMonth)
@Suppress("NOTHING_TO_INLINE")
inline fun TimePicker.timeChange(): TimePickerObservable =
TimePickerObservable(this)
Than you can call it:
datePicker.dateChange(2018,9,15)
.subscribe{
Log.d("RxDate", it.toString())
}