本来不打算写这篇的,但是有点激动,就记录下吧。在studio3.5之前的版本里。使用DataBinding的时候,经常会出现一些莫名其妙的bug。在xml没有代码提示也就忍了。但是有时候连在代码里代码都不提示。忍不了。在看了3.5的优化中,有一点说,只要在xml里写上绑定数据,都不用build,IDE会自动取生成,然后代码提示的问题也不见了,果断从3.2.0升级到了3.5。
唯一要注意的问题是studio3.5格式化布局,布局错乱解决方案
这里我说下2点经典优点。文章末尾会放出链接。即使不学习不使用MVVM框架。我也觉得对android开发之路有很大的帮助。
一、或许你以后会远离butterKnife 之初识DataBinding
不需要引入任何依赖,只要在你项目build.gradle的android标签上,加上:
dataBinding {
enabled = true
}
然后布局最外层用layout包裹。像这样。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
</layout>
然后在Activity里只要进行数据绑定下。就可以使用了
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sencond);
ActivitySencondBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_sencond);
binding.txt.setText("Hello Girl!!");
}
}
- ActivitySencondBinding 是DataBinding帮你生成的。是按照你的xml文件名+Binding生成。我这里xml:R.layout.activity_sencond
- DataBindingUtil:也是系统类(想想,在列表里ViewHolder里使用太爽)
- 通过binding.txt就获得到控件了。从此拒绝findViewById。或许也会让你远离butterKnife
- 虽然要写一下绑定的代码。但是你可以把它封装在Base里。统一用ViewDataBinding。这是他们的父类。但是在使用的时候记得强转成你当前的Binding
二、进行数据绑定
对于上面的的代码。我们可以继续优化。(这里看起来虽然有点脱裤子放屁,但是用到MVVM里确是可以实现数据和xml的双向绑定) 我们把Activity的布局改成这样
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="textStr"
type="String" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{textStr}"
/>
</RelativeLayout>
</layout>
- 加上 data 标签,variable 标签代表要绑定的一个值。name:相当于引用。type:是导入的包。在studio3.5后,有了代码提示
- 设置数据用@{textStr}。textStr是上面的引用。
那么此时的Activity里的代码是:
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sencond);
ActivitySencondBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_sencond);
binding.setTextStr("Hello Girl!!");
}
}
这里就算是数据绑定了。如果是要设置点击事件直接在加个绑定值data标签上加上:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
...//省略代码便于理解
<variable
name="onClickListener"
type="android.view.View.OnClickListener" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{textStr}"
android:onClick="@{onClickListener}"
/>
</RelativeLayout>
</layout>
Activity里当然是要把这个onClickListener设置进去了,Activity实现View.OnClickListener接口如下:
public class SecondActivity extends AppCompatActivity implements View.OnClickListener{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sencond);
ActivitySencondBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_sencond);
binding.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "就是这样", Toast.LENGTH_SHORT).show();
}
}
结束语
网上已经有很多讲的很详细了这里放2个链接:
希望对想要了解这块的兄弟有所帮助。!个人觉得。写一行绑定代码,可以帮你的Activity的页面节约多少代码啊!即使你用butterKnife,那也是很多很多。