美文网首页
DataBinding

DataBinding

作者: jiongge | 来源:发表于2017-04-24 20:13 被阅读42次

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表达式的使用,还有什么反向绑定的什么鬼。

相关文章

  • MVVM

    DataBinding基础用法 DataBinding入门 Android数据绑定框架DataBinding,堪称...

  • DataBinding

    dataBinding的使用 一、databinding的配置方法 二、databinding的基本使用 三、da...

  • DataBinding添加监听

    这章介绍DataBinding添加监听。如果不了解DataBinding的话,请查看[DataBinding的简单...

  • DataBinding系列(二):DataBinding的基本用

    在上一章 DataBinding系列(一):DataBinding初认识,我们已经认识了DataBinding,并...

  • Android MVVM模式的理解

    在之前的系列文章DataBinding系列(一):DataBinding初认识中讲过了关于DataBinding用...

  • dataBinding原理

    dataBinding如何绑定View? dataBinding如何修改View?

  • Android DataBinding

    Android DataBinding DataBinding 文档[https://developer.andr...

  • android databinding 初体验

    这是一篇databinding使用初体验,文章主要介绍了databinding使用,如何使用DataBinding...

  • Data Binding基础用法

    1.DataBinding配置2.DataBinding的使用3.UI/事件绑定 1.DataBinding配置 ...

  • dataBinding

    DataBinding DataBinding DataBinding是谷歌发布的一种数据绑定的框架,能够省去fi...

网友评论

      本文标题:DataBinding

      本文链接:https://www.haomeiwen.com/subject/iigpzttx.html