目前已经支持双向绑定,可以试着写一下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,确实方便了一些。但是感觉不支持双向绑定确实是一个遗憾,所以如果是我,我至少会等它支持双向绑定之后才会在项目中使用它。
最后上一张例子的效果图