Comme la question l'indique, comment lier l'écouteur de changement vérifié au bouton Switch en xml?
Je n'utilise pas la vue recycleur. Juste une mise en page simple.
Toute aide appréciée.
Vous pouvez le faire avec une référence de méthode:
<CheckBox Android:onCheckedChanged="@{callback::checkedChangedListener}".../>
ou avec une expression lambda si vous souhaitez passer différents paramètres:
<CheckBox Android:onCheckedChanged="@{() -> callback.checked()}".../>
En utilisant l'expression lambda et un Switch
:
public void onCheckedChanged(boolean checked) {
// implementation
}
Fichier XML:
<Android.support.v7.widget.SwitchCompat
Android:onCheckedChanged="@{(switch, checked) -> item.onCheckedChanged(checked)}"
...
/>
Où item
est la classe qui implémente la méthode onCheckedChange
et est importée dans le fichier XML comme ceci:
<data>
<variable
name="item"
type="yourClass"/>
</data>
Dans la mise en page
<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 activité
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]")
}
}
<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 activité
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]")
}
}
OnCheckedChangeListener
classe anonyme à la mise en page<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 activité
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]")
}
}
}
OnCheckedChangeListener
par référence<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}"
/>
Activité
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]")
}
}
Maintenant, si vous définissez CheckChangeListener
dans un code qui ne fonctionnera pas. car vous ne pouvez pas définir deux rappels sur un composant. Un rappel est déjà défini par liaison, donc votre rappel dans le code ne fonctionnera pas.
binding.mySwitch.setOnCheckedChangeListener { buttonView, isChecked -> println("buttonView = [$buttonView], isChecked = [$isChecked]") }
Vérifiez la classe CompoundButtonBindingAdapter pour voir comment fonctionne la liaison de commutateur.