1、环境设置
为了使用 data binding,gradle plugin的版本必须是 1.5.0-alpha1以上。
网上有很多介绍,这里就不多说了
附带链接:http://www.open-open.com/lib/view/open1483079134021.html#articleHeader1
2、简单使用
1、xml中的使用
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View" />
<variable
name="viewmodel"
type="com.iboxpay.saturn.edituser.EditUserViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<TextView
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="@={viewmodel.mobile}"/>
<TextView
android:layout_width="200dp"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:text="@={viewmodel.password}"/>
</LinearLayout></layout>
其实没有多大的难度,只是需要加上data标签。
data中的name随意设置,这个只是你再xml中使用的名字,代表的是type指定的类。
布局文件中的表达式使用 “@{}” 的语法。
2、Activity或者Fragment中的使用
上述只是在xml中设置了dinding的类,还需要再Activity或者fragment中绑定view和model(官方说法是 link view and model)
activity的onCreat中:
MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);//对于这个MainActivityBinding类是使用databinding后系统自动生成的类,里面包含了xml和model的bangding关系
Fragment的onCreatView:
ViewDataBinding binding = DataBindingUtil.inflate(inflater,R.layout.fragment_blank,container,false); return binding.getRoot();
到这里,我们只是实现了对象的互相获取,还需要进行数据的绑定,不然你的数据怎么更新到xml上
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//1.获取ViewDataBinding对象
DataBingMain dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_databinding);
//2.获取数据
UserEntity user = new UserEntity();
user.setName("lxf");
user.setSex("man");
user.setAge(25);
user.setType(1);
//3.绑定数据
dataBinding.setUser(user);
//dataBinding.setVariable(BR.user,user);
}
上面的第三步,setter方法对应的写法是,你xml中设置的name是什么,这里就写set什么 例如:name="viewModel",这里就写成setViewModel(对应xml中type的对象)。
3、dataBinding的简单使用
a、如上述代码所设,在activity中创建了model对象,通过set方法我们就实现了数据的链接
b、xml中onClick方法的实现
<Button
android:id="@+id/btn_print_again"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_weight="1"
android:background="@color/order_question"
android:onClick="@{viewModel.getSalesSlip}"
android:text="打印"
android:textColor="@color/white"
android:textSize="16sp"/>
在对应的type的model类中实现该方法则可:
/**
* 打印
*
* @param view
*/
public void getSalesSlip(View view) {
Log.e("sd", "查看签购单");
}
这里有一个是需要注意的,onClick事件对应的方法必须是public的还有就是必须有一个为View的参数(view就是你设置了onClick的那个View,上述代码就是Button)
c、获取xml自身的context来使用
<com.iboxpay.saturn.view.HorizontalItemView
style="@style/HorizontalItemView"
android:layout_height="41dp"
android:onClick="@{() -> viewModel.settlementList(context)}"
app:messageColor="@color/black_color54"
app:messageText="7.00"
app:messageToRight="true"
app:titleText="2017-04-01"/>
对应model中的代码
public void settlementList(Context context) {
Intent intent = new Intent(context, SettlementActivity.class);
context.startActivity(intent);
}
d、@BindingAdapter的使用
这个注解是用来创建自定义属性的,使用这个注解的话,不用在attrs中设置,直接上代码:
<com.iboxpay.saturn.view.SettlementView
android:id="@+id/sv_card"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
app:image="@{@drawable/svg_ic_list_card___24}"/>
<!--上面的image图片来源需要设置在drawable中才能生效-->
对应的model代码
@BindingAdapter(value = {"image"}, requireAll = false) public static void setImageResource(SettlementView settlementView, Drawable drawable) { settlementView.setSettlementTypeIcon(drawable); }
value对应xml中你自定义的属性如上面的image,requireAll:是否需要全部设置了自定义属性才初始化改方法(好像是这样理解的,后续查查)。
还有就是参数的问题,第一个参数是你设置了该属性的那个View,第二个就是xml中你这个自定义属性设置了对象(上述代码设置了drawable ,所以参数需要传递drawable对象,如果你传的是String 那就应该设置一个String的参数)
e、@BindingConversion的使用
用于属性的转换,例如当xml中的background属性设置了background="@{#FFFFFF
}",代码中设置了@bingConversion方法的时候,它会自动去寻找加了该注解的方法,进行转换。(这个例子好像没什么卵用,background设置了color好像就可以自动转换,不必多此一举)
@BindingConversion public static Drawable colorToDrawable(String color) { return new ColorDrawable(Color.parseColor(color)); }
f、减少逻辑代码的书写(这个好像就是databinding的初衷)
看代码最直接
<ImageView android:id="@+id/iv_pay_type" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="15.5dp" android:layout_marginStart="16dp" android:layout_marginTop="15.5dp" android:src='@{record.getTradeStatus() != "2" ? @drawable/ic_launcher : @drawable/ic_me_normal}' />
今天先写到这吧,这些是这几天来的摸索,但是不善言辞,可能有些遗漏。下篇在弄些关于数据实时更新的,还有双向绑定的,好像还漏和挺多的,还有一些xml表达式的使用,还有什么反向绑定的什么鬼。