如何使用ToggleButton执行双向数据绑定?

我的activity类中有一个ObservableBoolean字段,它绑定到我的ToggleButton的“checked”属性,如下所示:

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

我希望这会在按钮和布尔值之间创建一个双向关系,但它只会从字段到按钮进行更改,而不是其他方式。 我做错了什么,或者这不在Android DataBinding的范围内?

您需要另一个’=’来告诉Android您要使用双向数据绑定:

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

您可以在George Mount的wordpress文章中find更多相关信息:

双向数据绑定

Android不会受到典型数据输入的影响,将用户输入的变化反映回模型通常很重要。 例如,如果上述数据是以联系forms出现的,那么将编辑后的文本推回到模型中而不必从EditText中提取数据会很不错。 这是你如何做到的:

         

很漂亮,嗯? 这里唯一的区别是expression式标有@={}而不是@{} 。 预计大多数数据绑定将继续是单向的,我们不希望创建所有这些监听器并观察永远不会发生的变化。

无需使用ObservableBoolean ,您可以通过布尔variables的常规getter-setter方法执行此操作。 在您的模型类中这样

 public class User{ private boolean checked; public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } } 

ToggleButton上执行双向绑定。

  

并使用绑定variables获取此值。

 binding.getUser().isChecked() 

这是一个使用Switch的双向数据绑定的简单示例,它也具有Checked属性,如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"?>          

的build.gradle:

 android { ... dataBinding{ enabled=true } } 

源文档: https : //developer.android.com/topic/libraries/data-binding/index.html

  user.setChecked(true); 

如果您不在模型类中使用@Bindable属性,则此语法不会在View上折射。

 public class User extends BaseObservable{ private boolean checked; @Bindable public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; notifyPropertyChanged(BR.checked); } } 

然后像往常一样。

  

现在,如果您更改用户检查状态,它将起作用。

 user.setChecked(true);