DataBinding简单操作

目前已经支持双向绑定,可以试着写一下MVVM了



Databinding 是google官方推出的一个数据绑定框架,使用这个可以不用再写finViewById了,而且xml以前只能写布局文件,用了之后xml文件还可以进行更多的操作

当然好处不止这一些,但有点可惜的是现在还不支持双向绑定,所以只建议自己写Demo的时候可以用下,项目的话现在不推荐使用。

开发工具Android Studio2.0

1.5前后的版本操作不一样,这里只说一下1.5版本及以后的使用

比较好的是已经内置了Databinding,想用的话只需要在gradle里面配置一下就行了。很方便

      dataBinding {
            //noinspection GroovyAssignabilityCheck
            enabled true
        }




xml的变化较大,以前是LinearLayout之类的布局作为跟布局,使用databinding之后跟布局只是一个简单的layout。


<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <!-- 有两种不同的实现方法,这里用的import -->

        <!--  <variable
            name="user"
            type="com.example.y.databindingdemo.User" /> -->


        <!--<import type="com.example.y.databindingdemo.User" />-->

        <!-- <variable
            name="user"
            type="User" />-->

        <variable
            name="userName"
            type="String" />

        <variable
            name="passWord"
            type="String" />

    </data>


    <!-- 这里放以前的根布局 
           可以塞数据给User类去显示userName和passWord
           然后 android:text="@{user.userName}"
           或者passWord
    -->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{userName}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{passWord}" />


    </LinearLayout>


</layout>

以前的LinearLayout放在了layout里面。

data里面进行控件的数据填充或者属性。

可以看到有个variable,这个东西里面就指定type和name;

然后再控件中指定name


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{userName}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{passWord}" />

这样就完成了简单的绑定,就可以在java类中去进行数据的填充,绑定数据还有另外一种方法,这个下文会提到

Activity和以往不同的是不在使用setContentView进行布局绑定了,databinding会自动生成一个类似于ActivityXXXBinding文件,

 ActivityXXbinding viewDataBinding = DataBindingUtil.setContentView(this, getLayoutId());
  

为了方便操作写一个BaseActivity让Demo中的activity去继承这个BaseActivity


public abstract class BaseActivity extends AppCompatActivity {

    ViewDataBinding viewDataBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        viewDataBinding = DataBindingUtil.setContentView(this, getLayoutId());
    }

    protected abstract int getLayoutId();
}

如果用IDE的快捷键会发现创建的是ViewDataBinding,而不直接是类似于ActivityXXBinding.这样我们在使用的时候哪个activity需要,就强转成那个Activity就Ok了。

ActivityMainBinding activityEasyBinding = (ActivityMainBinding) viewDataBinding;

前面创建了两个TextView,现在万事俱备只欠东风,可以在代码中去填充数据了

        activityEasyBinding.setUserName("ABCDEFG");
        activityEasyBinding.setPassWord("123456");

这样可以直接在代码中填充数据

如图所示


这样确实可以减少findviewbyid,但是有的时候不得不需要那个控件。有两种方法可以拿到那个控件,推荐第二种

 activityEasyBinding.userName.setText("HAHAHAHAHAHAHHAHA");

1.为控件起一个id为userName,这个时候就可以直接在代码中.userName拿到那个控件了。当然这个方法适合于只拿一次或者次数不多的地方,一旦项目代码量变多了,需要多处改变这个控件的text,那就不能到处都.userName了

2.

       TextView textView = activityEasyBinding.userName;
        textView.setText("HAHAHAHAHAAH");


可以看到两种办法都能使textview的text变动。

既然控件都能拿到那么setOnClickListener之类的同理也可以实现。



xml的data里面还有import属性可以指定需要的java类。

在这里简单的实现一个逻辑操作。

public class DataUtils {


    public static String up(String content) {
        if (content != null && content.isEmpty()) {
            return "输入框没有数据";
        }
        return content;
    }
}


写一个简单的逻辑判断

然后在xml文件中指定这个类


 <data>

        <import type="com.example.y.databindingdemo.data.DataUtils" />

        <import type="com.example.y.databindingdemo.data.User" />


        <variable
            name="user"
            type="User" />

        <variable
            name="btn"
            type="String" />

        <variable
            name="btnCoalescing"
            type="String" />

        <variable
            name="test"
            type="String" />

        <variable
            name="userNameHint"
            type="String" />

        <variable
            name="passWordHint"
            type="String" />

    </data>



还是有个textview去显示数据

          <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="@{DataUtils.up(test)}" />

text去直接调用那个utils里面的方法。




如果在fragment中使用,就不能像在activity中那么直接的setContentView了,

DataBindingUtil.inflate(inflater, getLayoutId(), container, false).getRoot();

getRoot();可以拿到需要的那个view。然后在fragment中进行操作


如果进行网络操作需要listview recyclerview之类的数据交互的话也可以直接在adapter里面使用databinding,确实方便了一些。但是感觉不支持双向绑定确实是一个遗憾,所以如果是我,我至少会等它支持双向绑定之后才会在项目中使用它。

最后上一张例子的效果图




Demo下载地址:git csdn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值