google data-binding的简单使用

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())}"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值