关于Android中dataBinding使用的简单封装,我可以提供以下攻略:
1. 简介
DataBinding
是Android原生支持的一种将数据绑定到UI中的框架,它能够减少代码量,简化UI与数据之间的绑定过程,增加代码可读性。本文将为大家介绍如何对DataBinding
进行简单的封装,使得在实际使用过程中更加方便。
2. 如何封装
2.1 编写基类BindingAdapter
首先,我们需要定义一个基类的BindingAdapter
,用来绑定常见的UI操作,如设置文本、图片等,示例如下:
public abstract class BaseBindingAdapter {
// 设置文本
@BindingAdapter("android:text")
public static void setText(TextView view, String text) {
view.setText(text);
}
// 设置图片
@BindingAdapter("imageUrl")
public static void setImageUrl(ImageView view, String url) {
Glide.with(view.getContext()).load(url).into(view);
}
// 根据bool值设置View的可见性
@BindingAdapter("isVisible")
public static void setVisible(View view, boolean isVisible) {
view.setVisibility(isVisible ? View.VISIBLE : View.GONE);
}
// ... 其他常见UI操作
}
上述代码中,我们定义了三个BindingAdapter
:setText
、setImageUrl
和setVisible
,用来绑定设置文本、加载图片和设置可见性的操作。
2.2 编写数据类的基类
接下来,为了方便数据绑定,我们需要定义一个基类的数据类,所有的数据类都将继承该基类,示例如下:
public class BaseObservableObject extends BaseObservable {
@CallSuper
public void notifyChange() {
notifyPropertyChanged(BR._all);
}
}
上述代码中,我们定义了BaseObservableObject
类,它继承了BaseObservable
类,并定义了一个notifyChange()
方法,用来通知数据变化。所有继承了BaseObservableObject
的数据类,都需要在属性发生变化时调用该方法通知数据变化。
2.3 编写BindingAdapters类
接下来,我们需要定义一个BindingAdapters
类,用来绑定自定义的操作,示例如下:
public class BindingAdapters {
// 设置圆形图片
@BindingAdapter("circleImageUrl")
public static void setCircleImageUrl(ImageView view, String url) {
Glide.with(view.getContext())
.load(url)
.apply(RequestOptions.circleCropTransform())
.into(view);
}
// 设置View的点击事件
@BindingAdapter(value = {"onClick", "onClickBackground"}, requireAll = false)
public static void setOnClickListener(View view, View.OnClickListener listener, Drawable background) {
view.setOnClickListener(listener);
if (background != null) {
view.setBackground(background);
}
}
// ... 其他自定义操作
}
上述代码中,我们自定义了两个BindingAdapter
:setCircleImageUrl
用来加载圆形图片,setOnClickListener
用来设置View的点击事件,同时支持设置点击背景。
2.4 使用封装后的DataBinding
当我们完成了上述的封装代码之后,我们就可以在实际的使用中进行应用了,我们可以通过定义一个基类的ViewModel
类,所有的ViewModel
都继承该基类,示例如下:
public class BaseViewModel extends BaseObservableObject {
transient protected CompositeDisposable disposables = new CompositeDisposable();
public void addDisposable(Disposable disposable) {
disposables.add(disposable);
}
public void clearDisposable() {
disposables.clear();
}
@Override
protected void finalize() throws Throwable {
super.finalize();
disposables.dispose();
}
}
上述代码中,BaseViewModel
类继承自BaseObservableObject
类,同时定义了添加和清除disposable
的方法,当ViewModel
被销毁时,自动释放disposable
资源。
最后,我们可以通过DataBinding
来绑定数据和布局文件,示例如下:
<layout>
<data>
<import type="android.view.View"/>
<import type="com.example.myapplication.databinding.viewmodel.MainViewModel"/>
<variable
name="viewModel"
type="MainViewModel"/>
<variable
name="imageUrl"
type="String"/>
<variable
name="isVisible"
type="boolean"/>
</data>
<LinearLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:imageUrl="@{imageUrl}"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.text}"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:isVisible="@{isVisible}"
android:text="@{viewModel.text}"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="click me"
app:onClick="@{viewModel::onButtonClick}"/>
</LinearLayout>
</layout>
上述代码中,我们定义了一个布局文件,通过data
标签中定义的variable
来绑定数据和布局文件。可以通过app:
来调用之前定义的BindingAdapter
,同时也支持自定义操作的BindingAdapter
。
3. 示例说明
3.1 示例1
我们可以通过数据绑定来省略繁琐的UI操作,例如设置文本、加载图片、设置可见性等,示例如下:
<layout>
<data>
<import type="com.example.myapplication.databinding.model.User"/>
<variable
name="user"
type="User" />
</data>
<LinearLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:imageUrl="@{user.avatarUrl}"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:isVisible="@{user.hasSignedIn}"
android:text="@{user.signInText}"/>
</LinearLayout>
</layout>
上述代码中,我们通过@{}
来设置属性的值,其中@{user.avatarUrl}
用来加载图片,@{user.name}
用来设置文本,@{user.hasSignedIn}
用来设置可见性。
3.2 示例2
我们可以通过自定义的BindingAdapter
来实现更加复杂的操作,例如加载圆形图片、设置View的点击事件等,示例如下:
<layout>
<data>
<import type="com.example.myapplication.databinding.viewmodel.MainViewModel"/>
<variable
name="viewModel"
type="MainViewModel"/>
<variable
name="imageUrl"
type="String"/>
<variable
name="isVisible"
type="boolean"/>
</data>
<LinearLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:circleImageUrl="@{imageUrl}"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.text}"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:isVisible="@{isVisible}"
android:text="@{viewModel.text}"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="click me"
app:onClick="@{viewModel::onButtonClick}"
app:onClickBackground="@{@drawable/myBackground}"/>
</LinearLayout>
</layout>
上述代码中,我们通过自定义的BindingAdapter
实现了加载圆形图片、设置View的点击事件及点击背景。其中app:circleImageUrl
和app:isVisible
是之前自定义的两个BindingAdapter
,而app:onClick
和app:onClickBackground
则是自定义的setOnClickListener
方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android中dataBinding使用的简单封装 - Python技术站