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
?
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.
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()
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