怎么理解Databinding里面的Observable?和databinding里的双向绑定是如何实现的/
时间: 2024-05-21 16:16:09 浏览: 8
在 DataBinding 中,Observable 是一种可观察的数据对象,当这个对象的值发生变化时,会通知与之绑定的视图进行更新。Observable 可以是实现了 Observable 接口的 Java 类,也可以是继承了 BaseObservable 类的自定义类。
双向绑定指的是数据的变化可以自动反映到视图中,同时用户在视图中输入的数据也可以自动更新到数据对象中。在 DataBinding 中,双向绑定可以通过在视图中使用 @={...} 的方式来实现,这种方式会自动生成一个双向绑定的适配器类,用于将视图中的数据变化自动更新到数据对象中,同时也将数据对象中的变化自动更新到视图中。这个适配器类实现了 PropertyChangeListener 接口,通过监听数据对象的属性变化来实现双向绑定。
相关问题
kotlin 如何 使用 dataBinding 和 VideModel 完成双向绑定
要使用双向绑定,需要在项目中引入Data Binding库。在项目的build.gradle文件中添加以下依赖项:
```
android {
...
dataBinding {
enabled = true
}
}
dependencies {
...
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
}
```
接下来,我们需要创建ViewModel类。在ViewModel中定义我们需要绑定的变量,并提供getter和setter方法。例如:
```
class MyViewModel : ViewModel() {
var name = MutableLiveData<String>()
fun setName(newName: String) {
name.value = newName
}
fun getName(): String? {
return name.value
}
}
```
接下来,我们需要在布局文件中设置双向绑定。例如:
```
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="android.view.View"/>
<variable
name="viewModel"
type="com.example.MyViewModel"/>
</data>
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={viewModel.name}" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Set Name"
android:onClick="@{() -> viewModel.setName(editText.text.toString())}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.name}" />
</layout>
```
在这个布局文件中,我们使用了双向绑定来绑定EditText和TextView中的文本。我们还定义了一个Button来设置ViewModel中的变量。在Button的onClick属性中,我们调用了ViewModel中的setName()方法来设置变量的值。
最后,我们需要在Activity中创建ViewModel实例,并将其绑定到布局文件中。例如:
```
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
binding.viewModel = viewModel
binding.lifecycleOwner = this
}
}
```
在这个例子中,我们使用了DataBindingUtil类来绑定布局文件。我们还创建了一个ViewModel实例,并将其绑定到布局文件中。最后,我们设置了lifecycleOwner,以确保数据绑定可以正确地处理生命周期事件。
这样,我们就完成了使用dataBinding和ViewModel进行双向绑定的过程。
CheckedTextView 如何配合 dataBinding 和 VideModel 完成双向绑定定
首先,在 XML 文件中定义一个 CheckedTextView,然后使用 dataBinding 绑定它的 checked 属性到 ViewModel 中的一个 Boolean 变量:
```
<CheckedTextView
android:id="@+id/checkedTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Check me"
android:checked="@{viewModel.isChecked}"
/>
```
接下来,在 ViewModel 中定义一个 isChecked 变量,并且为它添加 getter 和 setter 方法:
```
private MutableLiveData<Boolean> isChecked = new MutableLiveData<>();
public LiveData<Boolean> getIsChecked() {
return isChecked;
}
public void setIsChecked(Boolean value) {
isChecked.setValue(value);
}
```
最后,在 Activity 或 Fragment 中将 ViewModel 与 dataBinding 绑定,并且监听 isChecked 变量的变化:
```
binding.setViewModel(viewModel);
binding.checkedTextView.setOnCheckedChangeListener((buttonView, isChecked) -> {
viewModel.setIsChecked(isChecked);
});
viewModel.getIsChecked().observe(this, isChecked -> {
binding.checkedTextView.setChecked(isChecked);
});
```
这样就完成了 CheckedTextView 和 ViewModel 的双向绑定。当 CheckedTextView 的状态改变时,ViewModel 中的 isChecked 变量也会被更新;而当 ViewModel 中的 isChecked 变量改变时,CheckedTextView 的状态也会被更新。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)