Utilizando CalendarView con enlace de datos
Quiero usar el enlace de datos bidireccional con AndroidLiveData
componentes como alternativa para los campos observables. Aquí hay un código para un proyecto simple conCalendarView
yEditText
que muestra información sobre el botón al que se hace clic.
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="testDate"
type="android.arch.lifecycle.MutableLiveData<Long>" />
<variable
name="testString"
type="android.arch.lifecycle.MutableLiveData<String>" />
</data>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onButtonClick"
android:text="Show data"/>
<CalendarView
android:id="@+id/cal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:date="@={testDate}"/>
<EditText
android:id="@+id/str"
android:text="@={testString}"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
Y código de actividad:
class MainActivity : AppCompatActivity() {
val liveDate = MutableLiveData<Long>().apply { value = System.currentTimeMillis() }
val liveString = MutableLiveData<String>().apply { value = "Date: " }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
.also {
it.testDate = liveDate
it.testString = liveString
it.cal.setOnDateChangeListener { view, year, month, dayOfMonth ->
Toast.makeText(applicationContext, "${view.date}", Toast.LENGTH_SHORT).show()
}
}
}
@TargetApi(Build.VERSION_CODES.O)
fun onButtonClick(view: View) {
Toast.makeText(this, liveString.value +
Instant.ofEpochMilli(liveDate.value!!).atZone(ZoneId.systemDefault()).toLocalDate()
, Toast.LENGTH_SHORT)
.show()
}
}
El enlace bidireccional funciona bien para String, pero no para la fecha. Encontréesta publicació, que dice que la fecha seleccionada es en realidad algo diferente de la fecha utilizada porandroid:date
... Muy bien, puede capturar esta acción de cambiar la fecha en el oyente. El problema es que el oyentesetOnDateChangeListener
(aplicado enalso {}
arriba) no se activa en absoluto, cuando hay una configuración de enlace bidireccional.
Corrígeme si me equivoco, pero si quiero obtener la fecha seleccionadaTengo qu utilizarOnDateChangeListener
. También parece ser incompatible conandroid:date@={...}
porque usar el enlace bidireccional parece anular a nuestro oyente. Tendría sentido siandroid:date@={...}
proporcionó la misma funcionalidad queOnDateChangeListener
, pero no lo hace.
Así que la pregunta final es: ¿es posible obtener la fecha seleccionada de alguna manera con enlace de datos bidireccional?