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

Gre*_*246 22 data-binding android togglebutton android-databinding

我的ObservableBoolean活动类中有一个字段,它绑定到我ToggleButton喜欢的"checked"属性:

android:checked="@{activity.editing}"
Run Code Online (Sandbox Code Playgroud)

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

yen*_*rah 42

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

android:checked="@={activity.editing}"
Run Code Online (Sandbox Code Playgroud)

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

双向数据绑定

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

<layout ...>
    <data>
        <variable type="com.example.myapp.User" name="user"/>
    </data>
    <RelativeLayout ...>
        <EditText android:text="@={user.firstName}" .../>
    </RelativeLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

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


Rav*_*avi 5

无需采取ObservableBoolean,您可以通过布尔变量的常规getter-setter方法执行此操作。在您的模型课中是这样的

public class User{
   private boolean checked;

   public boolean isChecked() {
       return checked;
   }

   public void setChecked(boolean checked) {
       this.checked = checked;
   }
}
Run Code Online (Sandbox Code Playgroud)

在上执行双向绑定ToggleButton

<ToggleButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="@={user.checked}"/>
Run Code Online (Sandbox Code Playgroud)

并使用绑定变量获取此值。

binding.getUser().isChecked()
Run Code Online (Sandbox Code Playgroud)

  • 您在setCheck中的isChecked()中缺少了@Bindable注解,在设置器中缺少了notifyPropertyChanged(BR.checked)。 (2认同)