web-dev-qa-db-fra.com

Comment utiliser la liaison de données pour l'événement Switch onCheckedChageListener?

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.

24

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()}".../>
8
George Mount

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)}"
    ...
/>

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>
27
tomrozb

Différentes façons

(1) Défini par expression de méthode

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]")
    }
}

(2) Défini par expression lambda et appel de méthode

<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]")
    }
}

(3) Passer 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]")
        }
    }
}

(4) Passez 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, ci-dessous ne fonctionnera PAS

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.

7
Khemraj