一直没使用过Data Binding,今天就来学习一下,有兴趣的朋友可以直接看官网的介绍Data Binding
准备工作
首先要在build.gradle中添加一句
dataBinding {
enabled = true
}123
添加的位置是这样的
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
dataBinding {
enabled = true
}
defaultConfig {
applicationId "c.sample"
minSdkVersion 21
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
12345678910111213141516
然后准备好布局,布局的文件名是会直接跟binding挂钩的,布局的时候xml的布局文件就不再单纯地展示 UI 元素,还需要定义 UI 元素用到的变量。所以,它的根节点不再是一个 ViewGroup,而是变成了 layout,并且新增了一个节点 data
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="c.sample.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{user.firstName}" />
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}" />
</LinearLayout>
</layout>1234567891011121314151617181920212223242526
可以看到在布局文件中的data节点有一个variable,名字是user,后面的type是类完整的类名,这个是在包中定义好的一个类(也可以使用其他的类)可以用来为xml中的其他组件设置数据
package c.sample;
public class User {
public String firstName;
public String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}123456789101112
com.android.databinding会根据xml文件的名称 Generate 一个继承自 ViewDataBinding 的类。
例如,这里 xml 的文件名叫 activity_main.xml,那么生成的类就是 ActivityMainBinding。
继续在MainActivity中绑定variable
package c.sample;
import android.databinding.DataBindingUtil;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import c.sample.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("dog","apple");
binding.setUser(user);
binding.tv1.setGravity(Gravity.CENTER);
binding.tv1.setTextColor(Color.BLUE);
}
}
1234567891011121314151617181920212223242526
注意,ActivityMainBinding 类是自动生成的,所有的 set 方法也是根据 variable 名称生成的,前面我们定义的是user,所以生成的也是setUser(),这里我还为第一个TextView设置了一下其他属性:
一个简单的数据绑定就完成了,解放了findViewById;
对事件进行绑定监听
例如:
onclick
onLongClick
onTextChange
对事件进行监听绑定的时候,绑定监听器接受的参数与返回值一定要与原监听器的接受一致
修改一下代码,在MainActivity中增加一个类Presenter(类名好像必须为这个),里面放了几个事件监听的回调:
package c.sample;
import android.databinding.DataBindingUtil;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Toast;
import c.sample.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
user = new User("dog","apple");
binding.setUser(user);
binding.setPresenter(new Presenter());
binding.tv1.setGravity(Gravity.CENTER);
binding.tv1.setTextColor(Color.BLUE);
}
public class Presenter {
public void onClickFriend(View view) {
Toast.makeText(MainActivity.this, "ABCDEFG", Toast.LENGTH_SHORT).show();
}
public boolean onLongClickFraiend(View view) {
Toast.makeText(MainActivity.this,"AAAAAAAAAAAAAAA",Toast.LENGTH_SHORT).show();
return true;
}
public void onTextChange(CharSequence text, int start, int lengthBefore, int lengthAfter) {
user.setFirstName(text.toString());
binding.setUser(user);
}
}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="c.sample.User" />
<variable name="presenter" type="c.sample.MainActivity.Presenter" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onTextChanged="@{presenter.onTextChange}"/>
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:onClick="@{presenter.onClickFriend}"/>
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
android:onLongClick="@{presenter.onLongClickFraiend}"
/>
</LinearLayout>
</layout>1234567891011121314151617181920212223242526272829303132
运行一下,效果如图:
好了,这只是一些基本的用法,感兴趣的朋友可以自己去看看官网,还有很多高级用法这里就不列举了。
---------------------
作者:白沙丶
来源:优快云
原文:https://blog.youkuaiyun.com/twoboat/article/details/52622863
版权声明:本文为博主原创文章,转载请附上博文链接!