1.数据绑定到ui的最简单使用
1) 在 build.gradle 文件的 android 配置中加入
dataBinding {
enabled = true
}
2)在xml文件的根节点layout下添加data节点
<data>
<variable
name="player"
type="com.zls.myarchicmpsample.Player" />
</data>
3)在xml文件中使用对象属性时,使用 @{}
<EditText
...
android:text="@{player.getName()}"/>
4) 项目会根据xml文件的名字生成binding类,加入xml文件名是 aa_bb.xml,那么binding类名是 AaBbBinding。获取binding类
AaBbBinding binding = DataBindingUtil.setContentView(this, R.layout.aa_bb);
binding.setVariable(BR.player, p);
BR.player 中的player就是在xml data节点定义的对象的name。
5)完整代码
//开启databinding的设置
android {
...
dataBinding {
enabled = true
}
}
//bean类
public class Player {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//布局文件
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="player"
type="com.zls.myarchicmpsample.Player" />
<variable
name="ma"
type="com.zls.myarchicmpsample.MainActivity" />
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:background="#7171C6">
<TextView
android:id="@+id/tv_name"
style="@style/playerAttribute"
android:text="name:"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:onClick="@{view -> ma.onClick(view)}"/>
<EditText
android:id="@+id/et_name"
style="@style/playerAttributeInput"
android:hint="input name"
app:layout_constraintLeft_toRightOf="@+id/tv_name"
app:layout_constraintTop_toTopOf="parent"
android:text="@{player.getName()}"
android:afterTextChanged="@{editable -> ma.updateName(editable.toString())}"/>
<TextView
android:id="@+id/tv_age"
style="@style/playerAttribute"
android:text="age:"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_name"
android:onClick="@{view -> ma.onClick(view)}"/>
<EditText
android:id="@+id/et_age"
style="@style/playerAttributeInput"
android:hint="input age"
app:layout_constraintLeft_toRightOf="@+id/tv_name"
app:layout_constraintTop_toBottomOf="@+id/tv_name"
android:text="@{String.valueOf(player.getAge())}" />
</android.support.constraint.ConstraintLayout>
</layout>
//设置xml文件中data节点定义的对象的地方
public class MainActivity extends AppCompatActivity {
Player p;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
p = new Player();
p.setName("ronaldo");
p.setAge(34);
binding.setVariable(BR.player, p);
binding.setVariable(BR.ma, this);
}
public void onClick(View view){
if(view.getId() == R.id.tv_name){
Toast.makeText(MainActivity.this, "input name", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this, "input age", Toast.LENGTH_SHORT).show();
}
}
public void updateName(String s){
p.setName(s);
Toast.makeText(MainActivity.this, String.format("name is %s", p.getName()),
Toast.LENGTH_SHORT).show();
}
}
2. android:text 属性值必须是 string,所以直接写
android:text="@{player.getAge()}"
会报错。需要写成
android:text="@{String.valueOf(player.getAge())}"
3. 绑定点击事件 -> android:onClick="@{() -> ma.onClick()}"
4. 点击事件传递参数 -> android:onClick="@{view -> ma.onClick(view )}"
5. ui内容绑定到对象 -> android:afterTextChanged="@{editable -> ma.updateName(editable.toString())}"