ejemplo edittext databinding data android data-binding android-switch

edittext - databinding android



¿Cómo utilizar el enlace de datos para el evento Switch onCheckedChageListener? (3)

Puedes hacerlo con una referencia de método:

<CheckBox android:onCheckedChanged="@{callback::checkedChangedListener}".../>

o con una expresión lambda si quieres pasar diferentes parámetros:

<CheckBox android:onCheckedChanged="@{() -> callback.checked()}".../>

Como indica la pregunta, ¿cómo vincular el oyente de cambio marcado al botón Cambiar en xml?

No estoy usando la vista de reciclador. Sólo un diseño simple.

Cualquier ayuda apreciada.


Usando la expresión lambda y un Switch :

public void onCheckedChanged(boolean checked) { // implementation }

Archivo XML:

<android.support.v7.widget.SwitchCompat android:onCheckedChanged="@{(switch, checked) -> item.onCheckedChanged(checked)}" ... />

Donde item es la clase que implementa el método onCheckedChange y se importa al archivo XML de esta manera:

<data> <variable name="item" type="yourClass"/> </data>


Aquí hay formas de configurar OnCheckedChangeListener en enlace de datos:

(1) Establecer por expresión de método

En diseño

<variable name="activity" type="com.innovanathinklabs.sample.activities.CalendarActivity"/> <Switch android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="@={model.checked}" android:onCheckedChanged="@{activity::onGenderChanged}" />

En actividad

class HomeActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar) binding.activity = this binding.model = Model() } fun onGenderChanged(buttonView: CompoundButton, isChecked: Boolean) { println("buttonView = [$buttonView], isChecked = [$isChecked]") } }

(2) Establecido por expresión lambda y método de llamada

<variable name="model" type="com.innovanathinklabs.sample.data.Model"/> <variable name="activity" type="com.innovanathinklabs.sample.activities.HomeActivity"/> <Switch android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="@={model.checked}" android:onCheckedChanged="@{(button, bool)-> activity.saveGender(bool)}" />

En actividad

class HomeActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar) binding.activity = this binding.model = Model() } fun saveGender(isChecked: Boolean) { println("isChecked = [$isChecked]") } }

(3) Pase la clase anónima OnCheckedChangeListener al diseño

<variable name="onGenderChange" type="android.widget.CompoundButton.OnCheckedChangeListener"/> <Switch android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="@={model.checked}" android:onCheckedChanged="@{onGenderChange}" />

En actividad

class HomeActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar) binding.model = Model() binding.setOnGenderChange { buttonView, isChecked -> println("buttonView = [$buttonView], isChecked = [$isChecked]") } } }

(4) Pase OnCheckedChangeListener por referencia

<variable name="onGenderChange2" type="android.widget.CompoundButton.OnCheckedChangeListener"/> <Switch android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="@={model.checked}" android:onCheckedChanged="@{onGenderChange2}" />

Actividad

class HomeActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar) binding.model = Model() binding.onGenderChange2 = onGenderChange } private val onGenderChange: CompoundButton.OnCheckedChangeListener = CompoundButton.OnCheckedChangeListener { buttonView, isChecked -> println("buttonView = [$buttonView], isChecked = [$isChecked]") } }

Esto nunca funcionará

Porque no puede establecer dos devoluciones de llamada en un componente. Una devolución de llamada ya está establecida por un enlace de dos vías, por lo que su devolución de llamada no funcionará.

binding.mySwitch.setOnCheckedChangeListener { buttonView, isChecked -> println("buttonView = [$buttonView], isChecked = [$isChecked]") }

Verifique la clase CompoundButtonBindingAdapter para ver cómo funciona el enlace de conmutación.