【问题标题】:How Data Binding and Observable pattern works in Android?数据绑定和可观察模式如何在 Android 中工作?
【发布时间】:2018-01-20 00:33:37
【问题描述】:

我正在学习 Android 中的数据绑定,我有点困惑 Observable 模式的工作原理。

我有一个例子:

public class MainActivity extends AppCompatActivity {

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

    ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    activityMainBinding.setStudent(new Student("Rahul"));
    activityMainBinding.executePendingBindings();
}
}

public class Student extends BaseObservable {

private String  name;

public Student(String rahul) {
    name = rahul;
}

@Bindable
public String getName() {      
    return this.name;
}


public void setName(String name) {        
    this.name = name;
   notifyPropertyChanged(BR.name);
}
}

xml 样式:

<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
    <variable
        name="student"
        type="example.com.password.Student"/>
</data>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="example.com.password.MainActivity"
    android:orientation="vertical">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="@={student.name}"/>

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@{student.name}"/>

    <Button
        android:id="@+id/textViewa"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

我对这里的工作流程有一些疑问:

TextView 如何准确知道 Student.name 何时更改?

getter 方法中的 @Binding 注释和 setter 方法中的 notifyPropertyChanged(BR.name) 有什么作用?

【问题讨论】:

    标签: android data-binding observable


    【解决方案1】:

    TextView 如何准确知道 Student.name 何时更改?

    getter 方法上的 @Binding 注释和 setter 方法中的 notifyPropertyChanged(BR.name) 做什么?

    对于每个带有@Bindable 注释的方法,都会生成一个带有方法名称的 BR(Binding Resource,Data Binding 等效于 R.java)字段,删除 get 前缀(此处为 BR.name)。

    在调用notifyPropertyChanged(BR.name) 时,数据绑定使映射方法(此处为getName())的使用无效,并调用该方法以获取新数据并在 textView 中更新新值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-01
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 2014-03-24
      • 2020-07-20
      相关资源
      最近更新 更多