web-dev-qa-db-fra.com

Comment effectuer une liaison de données bidirectionnelle avec un ToggleButton?

J'ai un champ ObservableBoolean dans ma classe d'activité, qui est lié à l'attribut "vérifié" de ma ToggleButton comme ceci:

Android:checked="@{activity.editing}"

J'espérais que cela créerait une relation à double sens entre le bouton et le booléen, mais cela ne porterait que les modifications du champ au bouton, et non l'inverse. Qu'est-ce que je fais de mal, ou n'est-ce pas dans le cadre d'Android DataBinding?

15
Gregorio246

Vous avez besoin d'un autre '=' pour indiquer à Android que vous souhaitez utiliser la liaison de données bidirectionnelle:

Android:checked="@={activity.editing}"

Vous pouvez trouver plus d'informations à ce sujet dans l'article wordpress de George Mount :

_ {Liaison de données bidirectionnelle} _

Android n’est pas à l’abri d’une saisie de données classique et il est souvent important de refléter les modifications apportées par la saisie de l’utilisateur au modèle. Par exemple, si les données ci-dessus se trouvaient dans un formulaire de contact, il serait pratique que le texte modifié soit replacé dans le modèle sans avoir à extraire les données de la propriété EditText. Voici comment vous le faites:

<layout ...>
    <data>
        <variable type="com.example.myapp.User" name="user"/>
    </data>
    <RelativeLayout ...>
        <EditText Android:text="@={user.firstName}" .../>
    </RelativeLayout>
</layout>

Assez chouette, hein? La seule différence est que l'expression est marquée avec @={} au lieu de @{}. On s’attend à ce que la plupart des liaisons de données continuent d’être à sens unique et nous ne voulons pas que tous ces écouteurs soient créés et surveillent les changements qui ne se produiront jamais.

32
yennsarah

Pas besoin de prendre ObservableBoolean, vous pouvez effectuer cette opération avec la méthode getter-setter habituelle de la variable booléenne Comme ceci dans votre classe de modèle

public class User{
   private boolean checked;

   public boolean isChecked() {
       return checked;
   }

   public void setChecked(boolean checked) {
       this.checked = checked;
   }
}

effectuez une liaison bidirectionnelle sur votre ToggleButton.

<ToggleButton
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:checked="@={user.checked}"/>

et récupérez cette valeur en utilisant une variable de liaison.

binding.getUser().isChecked()
4
Ravi Rupareliya

Voici un exemple simple de liaison de données bidirectionnelle à l'aide d'un commutateur, qui possède également la propriété Checked, comme ToggleButton.

Item.Java:

import Android.databinding.BaseObservable;
import Android.databinding.Bindable;

public class Item extends BaseObservable {
    private Boolean checked;
    @Bindable
    public Boolean getChecked() {
        return this.checked;
    }
    public void setChecked(Boolean checked) {
        this.checked = checked;
        notifyPropertyChanged(BR.checked);
    }
}

MainActivity.Java:

public class MainActivity extends AppCompatActivity {

    public Item item;
    ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        item = new Item();
        item.setChecked(true);

        /* By default, a Binding class will be generated based on the name of the layout file,
        converting it to Pascal case and suffixing “Binding” to it.
        The above layout file was activity_main.xml so the generate class was ActivityMainBinding */

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.setItem(item);
    }

    public void button_onClick(View v) {
        item.setChecked(!item.getChecked());
    }
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <data>
        <variable
            name="item"
            type="com.example.abc.twowaydatabinding.Item" />
    </data>

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">

        <Switch
            Android:id="@+id/switch_test"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:checked="@={item.checked}" />

        <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="change"
            Android:onClick="button_onClick"/>

    </LinearLayout>
</layout>

build.gradle:

Android {
...
    dataBinding{
        enabled=true
    }

}

Documentation source: https://developer.Android.com/topic/libraries/data-binding/index.html

2
live-love