您的位置:首页 > 移动开发 > Android开发

DataBinding简单操作

2016-05-21 14:49 453 查看
目前已经支持双向绑定,可以试着写一下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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android databinding