android dataBinding使用

使用dataBinding,就不需要findViewById操作,可以在代码里设置赋值数据,直接绑定到页面上显示出来。

一、dataBinding简单使用

1、配制dataBinding ,首先在build.gradle文件中添加dataBinding配制,如图下

dataBinding {
    enabled = true
}

2、在页面中添加layout布局,添加data标签,并添加variable,设置name和类对象。操作方法:光标放在第一行第一个位置前按Alt+回车,选择Convert to data binding layout 回车,就可以自动生成,如下代码和截图  

 在data里添加variable配制

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </LinearLayout>
</layout>

添加variable配制后代码如下 ,name自定义,type是对象类,在TextView中直接获取对象绑定数据显示 ,注意对象类变量要设置public,不然无法访问到对象。

android:text="@{user.name}"
<?xml version="1.0" encoding="utf-8"?>
<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="user"
            type="com.nyw.databingingdemo.UserInfoUtil" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">


            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.name}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.sex}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.phone}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />


        </LinearLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 对象类如下代码

package com.nyw.databingingdemo;

public class UserInfoUtil {
    public String name;
    public String sex;
    public String phone;

    public UserInfoUtil(String name, String sex, String phone) {
        this.name = name;
        this.sex = sex;
        this.phone = phone;
    }
}

这是activity里代码,可以动态设置对象类内容修改UI页面数据绑定了 

下面代码中,使用了DataBindingUtil中的setContentView方法加载页面,返回ActivityMainBinding对象,通过ActivityMainBinding进行绑定数据。

package com.nyw.databingingdemo;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;

import android.os.Bundle;

import com.nyw.databingingdemo.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
        ActivityMainBinding activityMainBinding=DataBindingUtil.setContentView(this,R.layout.activity_main);
        UserInfoUtil userInfoUtil =new UserInfoUtil("张三","26","18977092827");
        activityMainBinding.setUser(userInfoUtil);
    }
}

 二、在上面的基础上使用dataBinding事件绑定及import标签使用

1、事件点击绑定代码如下

activity 主要添加绑定代码

//点击按钮,添加按钮点击事件
activityMainBinding.setEvent(new EventHandleListenner(this));
package com.nyw.databingingdemo;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;

import android.os.Bundle;

import com.nyw.databingingdemo.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
        ActivityMainBinding activityMainBinding=DataBindingUtil.setContentView(this,R.layout.activity_main);
        UserInfoUtil userInfoUtil =new UserInfoUtil("张三",31,"18977092827");
        activityMainBinding.setUser(userInfoUtil);

        //点击按钮,添加按钮点击事件
        activityMainBinding.setEvent(new EventHandleListenner(this));
    }
}
EventHandleListenner类中的方法,主要处理点击事件,注意这里使用public
package com.nyw.databingingdemo;

import android.content.Context;
import android.view.View;
import android.widget.Toast;

public class EventHandleListenner {
    private  Context context;
   public EventHandleListenner (Context context){
       this.context=context;
    }
    public void buttonOnClick(View view){
        Toast.makeText(context,"点击按钮了",Toast.LENGTH_SHORT).show();
    }
}

 如下在页面中绑定,代码如下,主要看如下一行代码

首先使用variable导入类,然后就可以使用如下一行代码绑定点击事件方法

android:onClick="@{event.buttonOnClick}"
<?xml version="1.0" encoding="utf-8"?>
<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="user"
            type="com.nyw.databingingdemo.UserInfoUtil" />
        <import type="com.nyw.databingingdemo.UserInfo"/>

        <variable
            name="event"
            type="com.nyw.databingingdemo.EventHandleListenner" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">


            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.name}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{UserInfo.getSex(user.sex)}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.phone}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="30dp"
                android:onClick="@{event.buttonOnClick}"
                android:textColor="@color/black"
                android:text="我是按钮"/>


        </LinearLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 2、import标签使用

activity代码如下:

UserInfoUtil类中,性别是int 

package com.nyw.databingingdemo;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;

import android.os.Bundle;

import com.nyw.databingingdemo.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
        ActivityMainBinding activityMainBinding=DataBindingUtil.setContentView(this,R.layout.activity_main);
        UserInfoUtil userInfoUtil =new UserInfoUtil("张三",31,"18977092827");
        activityMainBinding.setUser(userInfoUtil);

    }
}

 性别是int的

package com.nyw.databingingdemo;

public class UserInfoUtil {
    public String name;
    public int  sex;
    public String phone;

    public UserInfoUtil(String name, int sex, String phone) {
        this.name = name;
        this.sex = sex;
        this.phone = phone;
    }
}

接着我们在看另一个类中,有一个静态方法,当传入一个数字的时候,就拼接字符串返回 数据显示在页面中

package com.nyw.databingingdemo;

public class UserInfo {
    public static String getSex(int sex){
        return  "我已经"+sex+"岁了";
    }
}

 页面代码绑定数据显示如下

在页面中直接import导入UserInfo类,在页面中就可以直接 调用 转换数据了

android:text="@{UserInfo.getSex(user.sex)}"
<?xml version="1.0" encoding="utf-8"?>
<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="user"
            type="com.nyw.databingingdemo.UserInfoUtil" />
        <import type="com.nyw.databingingdemo.UserInfo"/>

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">


            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.name}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{UserInfo.getSex(user.sex)}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.phone}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />



        </LinearLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

三、dataBinding 在二级页面中使用

比如说在页面中添加include导入新的页面,我们这里称为二级页面,如下我添加一个二级页面显示手机号码,把dataBinding传给二级页面,

通过这一行代码把dataBinding传给二级页面

app:user ="@{user}"  
        <include
            layout="@layout/layout_main"
            app:user ="@{user}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/linearLayout" />

完整页面代码如下,主要上面一行代码把dataBinding传给二级页面:

<?xml version="1.0" encoding="utf-8"?>
<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="user"
            type="com.nyw.databingingdemo.UserInfoUtil" />
        <import type="com.nyw.databingingdemo.UserInfo"/>

        <variable
            name="event"
            type="com.nyw.databingingdemo.EventHandleListenner" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <LinearLayout
            android:id="@+id/linearLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">


            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.name}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{UserInfo.getSex(user.sex)}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.phone}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="30dp"
                android:onClick="@{event.buttonOnClick}"
                android:text="我是按钮"
                android:textColor="@color/black" />


        </LinearLayout>

        <include
            layout="@layout/layout_main"
            app:user ="@{user}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/linearLayout" />


    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

二级页面布局,显示一个手机号码,二级页面中,也需要使用dataBinding,也需要一级页面中的variable,二级页面中也写上。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="user"
            type="com.nyw.databingingdemo.UserInfoUtil" />
        <import type="com.nyw.databingingdemo.UserInfo"/>
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{user.phone}"/>
    </LinearLayout>
</layout>

 通过在一级页面中设置app:user ="@{user}" 这样一行代码就完成二级页面中使用dataBinding绑定页面数据。

四、dataBinding加载图片

1、dataBinding加载网络图片

页面主要代码如下

app:imageUrl调用的时候,imageUrl与ImageViewBindingAdapter类中注解一致,不然报错

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="300dp"
            android:layout_height="200dp"
            android:layout_gravity="center_vertical"
            android:scaleType="centerInside"
            app:imageUrl="@{imageData}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/linearLayout"
            tools:ignore="MissingConstraints" />

 type 传String类型

        <variable
            name="imageData"
            type="String" />

页面完整代码 如下

<?xml version="1.0" encoding="utf-8"?>
<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="user"
            type="com.nyw.databingingdemo.UserInfoUtil" />
        <import type="com.nyw.databingingdemo.UserInfo"/>

        <variable
            name="event"
            type="com.nyw.databingingdemo.EventHandleListenner" />

        <variable
            name="imageData"
            type="String" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <LinearLayout
            android:id="@+id/linearLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">


            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.name}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{UserInfo.getSex(user.sex)}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.phone}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="30dp"
                android:onClick="@{event.buttonOnClick}"
                android:text="我是按钮"
                android:textColor="@color/black" />


        </LinearLayout>

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="300dp"
            android:layout_height="200dp"
            android:layout_gravity="center_vertical"
            android:scaleType="centerInside"
            app:imageUrl="@{imageData}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/linearLayout"
            tools:ignore="MissingConstraints" />

        <include
            android:id="@+id/include"
            layout="@layout/layout_main"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/imageView"
            app:user="@{user}" />


    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

ImageViewBindingAdapter类代码 
package com.nyw.databingingdemo;

import android.app.Activity;
import android.text.TextUtils;
import android.widget.ImageView;

import androidx.databinding.BindingAdapter;

import com.bumptech.glide.Glide;

public class ImageViewBindingAdapter {


    //添加一个BindingAdapter注解,方法有两个参数,一个是控件,一个是图片加载url地址,这里注解imageUrl,在页面app调用的时候也是imageUrl,这两个地方保持一致
    @BindingAdapter("imageUrl")
    public static  void setImageInfo(ImageView image, String imgUrl){
        //使用Glide加载图片显示
        if (!TextUtils.isEmpty(imgUrl)) {
            Glide.with(image.getContext()).load(imgUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(image);
        }
    }
}

java代码如下

  ActivityMainBinding activityMainBinding=DataBindingUtil.setContentView(this,R.layout.activity_main);
        //加载网络图片显示
        activityMainBinding.setImageData("https://pics5.baidu.com/feed/f9198618367adab4b1f5853d3fd707148701e4b0.jpeg?token=9a09a0393bc7d28b96fb68a7b1cd5695");

全部代码如下

package com.nyw.databingingdemo;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;

import android.os.Bundle;

import com.nyw.databingingdemo.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
        ActivityMainBinding activityMainBinding=DataBindingUtil.setContentView(this,R.layout.activity_main);
        UserInfoUtil userInfoUtil =new UserInfoUtil("张三",31,"18977092827");
        activityMainBinding.setUser(userInfoUtil);

        //点击按钮,添加按钮点击事件
        activityMainBinding.setEvent(new EventHandleListenner(this));
        //加载网络图片显示
        activityMainBinding.setImageData("https://pics5.baidu.com/feed/f9198618367adab4b1f5853d3fd707148701e4b0.jpeg?token=9a09a0393bc7d28b96fb68a7b1cd5695");
    }
}

2、databinding加载本地图片

页面主要代码

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="100dp"
            android:layout_height="150dp"
            android:layout_gravity="center_vertical"
            android:scaleType="centerInside"
            app:image="@{image}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/imageView"
            tools:ignore="MissingConstraints" />
        <variable
            name="image"
            type="int" />

页面全部代码如下

<?xml version="1.0" encoding="utf-8"?>
<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="user"
            type="com.nyw.databingingdemo.UserInfoUtil" />
        <import type="com.nyw.databingingdemo.UserInfo"/>

        <variable
            name="event"
            type="com.nyw.databingingdemo.EventHandleListenner" />

        <variable
            name="imageData"
            type="String" />
        <variable
            name="image"
            type="int" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <LinearLayout
            android:id="@+id/linearLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">


            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.name}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{UserInfo.getSex(user.sex)}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.phone}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="30dp"
                android:onClick="@{event.buttonOnClick}"
                android:text="我是按钮"
                android:textColor="@color/black" />


        </LinearLayout>

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="100dp"
            android:layout_height="150dp"
            android:layout_gravity="center_vertical"
            android:scaleType="centerInside"
            app:imageUrl="@{imageData}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/linearLayout"
            tools:ignore="MissingConstraints" />
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="100dp"
            android:layout_height="150dp"
            android:layout_gravity="center_vertical"
            android:scaleType="centerInside"
            app:image="@{image}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/imageView"
            tools:ignore="MissingConstraints" />

        <include
            android:id="@+id/include"
            layout="@layout/layout_main"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/imageView"
            app:user="@{user}" />


    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

ImageViewBindingAdapter主要代码如下
    /**
     * 加载本地图片
     *   添加一个BindingAdapter注解,方法有两个参数,一个是控件,一个是图片,这里注解image,在页面app调用的时候也是image,这两个地方保持一致
     */
    @BindingAdapter("image")
    public static  void setImage(ImageView image, int img){
        //使用Glide加载图片显示
        if (!TextUtils.isEmpty(img+"")) {
            image.setImageResource(img);
        }
    }

ImageViewBindingAdapter类全部代码如下

package com.nyw.databingingdemo;

import android.app.Activity;
import android.text.TextUtils;
import android.widget.ImageView;

import androidx.databinding.BindingAdapter;

import com.bumptech.glide.Glide;

public class ImageViewBindingAdapter {


    /**
     * 加载网络图片
     *   添加一个BindingAdapter注解,方法有两个参数,一个是控件,一个是图片加载url地址,这里注解imageUrl,在页面app调用的时候也是imageUrl,这两个地方保持一致
     */
    @BindingAdapter("imageUrl")
    public static  void setImageInfo(ImageView image, String imgUrl){
        //使用Glide加载图片显示
        if (!TextUtils.isEmpty(imgUrl)) {
            Glide.with(image.getContext()).load(imgUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(image);
        }
    }
    /**
     * 加载本地图片
     *   添加一个BindingAdapter注解,方法有两个参数,一个是控件,一个是图片,这里注解image,在页面app调用的时候也是image,这两个地方保持一致
     */
    @BindingAdapter("image")
    public static  void setImage(ImageView image, int img){
        //使用Glide加载图片显示
        if (!TextUtils.isEmpty(img+"")) {
            image.setImageResource(img);
        }
    }
}

在java代码中调用 赋值显示

        ActivityMainBinding activityMainBinding=DataBindingUtil.setContentView(this,R.layout.activity_main);

        //加载本地图片
        activityMainBinding.setImage(R.mipmap.ic_launcher);

查看java全部代码如下

package com.nyw.databingingdemo;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;

import android.os.Bundle;

import com.nyw.databingingdemo.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
        ActivityMainBinding activityMainBinding=DataBindingUtil.setContentView(this,R.layout.activity_main);
        UserInfoUtil userInfoUtil =new UserInfoUtil("张三",31,"18977092827");
        activityMainBinding.setUser(userInfoUtil);

        //点击按钮,添加按钮点击事件
        activityMainBinding.setEvent(new EventHandleListenner(this));
        //加载网络图片显示
        activityMainBinding.setImageData("https://pics5.baidu.com/feed/f9198618367adab4b1f5853d3fd707148701e4b0.jpeg?token=9a09a0393bc7d28b96fb68a7b1cd5695");
        //加载本地图片
        activityMainBinding.setImage(R.mipmap.ic_launcher);
    }
}

3、支持本地图片与网络图片二选择一显示

在上面的基础上,主要修改ImageViewBindingAdapter代码

主要代码如下


    /**
     * 如果有网络图片就加载网络图片,没有网络图片就加载本地图片
     *   添加一个BindingAdapter注解,方法有两个参数,一个是控件,一个是图片,这里注解image,在页面app调用的时候也是image,这两个地方保持一致
     *   requireAll=false 是否必须为每个属性分配绑定表达式,或者是否可以没有某些属性。当此值为false时,当至少有一个关联属性具有绑定表达式时,将调用BindingAdapter。
     *   没有绑定表达式(即使是普通的XML值)的属性将导致相关参数接收Java默认值。必须注意确保缺省值不与有效的XML值混淆。
     * 返回:
     * 是否必须为每个属性分配绑定表达式。默认值为true。
     */
    @BindingAdapter(value = {"imgUrl","localRes"},requireAll = false)
    public static  void setLocalAndUrlImage(ImageView image, String imgUrl,int resId){
        //使用Glide加载图片显示
        if (!TextUtils.isEmpty(imgUrl)) {
            Glide.with(image.getContext()).load(imgUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(image);
        }else {
            image.setImageResource(resId);
        }
    }

全部代码如下

package com.nyw.databingingdemo;

import android.app.Activity;
import android.text.TextUtils;
import android.widget.ImageView;

import androidx.databinding.BindingAdapter;

import com.bumptech.glide.Glide;

public class ImageViewBindingAdapter {


    /**
     * 加载网络图片
     *   添加一个BindingAdapter注解,方法有两个参数,一个是控件,一个是图片加载url地址,这里注解imageUrl,在页面app调用的时候也是imageUrl,这两个地方保持一致
     */
    @BindingAdapter("imageUrl")
    public static  void setImageInfo(ImageView image, String imgUrl){
        //使用Glide加载图片显示
        if (!TextUtils.isEmpty(imgUrl)) {
            Glide.with(image.getContext()).load(imgUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(image);
        }
    }
    /**
     * 加载本地图片
     *   添加一个BindingAdapter注解,方法有两个参数,一个是控件,一个是图片,这里注解image,在页面app调用的时候也是image,这两个地方保持一致
     */
    @BindingAdapter("image")
    public static  void setImage(ImageView image, int img){
        //使用Glide加载图片显示
        if (!TextUtils.isEmpty(img+"")) {
            image.setImageResource(img);
        }
    }

    /**
     * 如果有网络图片就加载网络图片,没有网络图片就加载本地图片
     *   添加一个BindingAdapter注解,方法有两个参数,一个是控件,一个是图片,这里注解image,在页面app调用的时候也是image,这两个地方保持一致
     *   requireAll=false 是否必须为每个属性分配绑定表达式,或者是否可以没有某些属性。当此值为false时,当至少有一个关联属性具有绑定表达式时,将调用BindingAdapter。
     *   没有绑定表达式(即使是普通的XML值)的属性将导致相关参数接收Java默认值。必须注意确保缺省值不与有效的XML值混淆。
     * 返回:
     * 是否必须为每个属性分配绑定表达式。默认值为true。
     */
    @BindingAdapter(value = {"imgUrl","localRes"},requireAll = false)
    public static  void setLocalAndUrlImage(ImageView image, String imgUrl,int resId){
        //使用Glide加载图片显示
        if (!TextUtils.isEmpty(imgUrl)) {
            Glide.with(image.getContext()).load(imgUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(image);
        }else {
            image.setImageResource(resId);
        }
    }

}

页面代码调用主要如下,可以设置多个属性

app:localRes="@{image}"
app:imgUrl="@{imageData}"
        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="100dp"
            android:layout_height="150dp"
            android:layout_gravity="center_vertical"
            android:scaleType="centerInside"
            app:localRes="@{image}"
            app:imgUrl="@{imageData}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/imageView1"
            tools:ignore="MissingConstraints" />

页面全部代码如下

<?xml version="1.0" encoding="utf-8"?>
<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="user"
            type="com.nyw.databingingdemo.UserInfoUtil" />
        <import type="com.nyw.databingingdemo.UserInfo"/>

        <variable
            name="event"
            type="com.nyw.databingingdemo.EventHandleListenner" />

        <variable
            name="imageData"
            type="String" />
        <variable
            name="image"
            type="int" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <LinearLayout
            android:id="@+id/linearLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">


            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.name}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{UserInfo.getSex(user.sex)}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.phone}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="30dp"
                android:onClick="@{event.buttonOnClick}"
                android:text="我是按钮"
                android:textColor="@color/black" />


        </LinearLayout>

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="100dp"
            android:layout_height="150dp"
            android:layout_gravity="center_vertical"
            android:scaleType="centerInside"
            app:imageUrl="@{imageData}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/linearLayout"
            tools:ignore="MissingConstraints" />
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="100dp"
            android:layout_height="150dp"
            android:layout_gravity="center_vertical"
            android:scaleType="centerInside"
            app:image="@{image}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/imageView"
            tools:ignore="MissingConstraints" />

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="100dp"
            android:layout_height="150dp"
            android:layout_gravity="center_vertical"
            android:scaleType="centerInside"
            app:localRes="@{image}"
            app:imgUrl="@{imageData}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/imageView1"
            tools:ignore="MissingConstraints" />

        <include
            android:id="@+id/include"
            layout="@layout/layout_main"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/imageView2"
            app:user="@{user}" />


    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

最后在java代码里传入值,比如说下面加载网络图片与加载本地图片的时候可以只选择其中一个显示,到此完成

//加载网络图片显示
activityMainBinding.setImageData("https://pics5.baidu.com/feed/f9198618367adab4b1f5853d3fd707148701e4b0.jpeg?token=9a09a0393bc7d28b96fb68a7b1cd5695");
//加载本地图片
activityMainBinding.setImage(R.mipmap.ic_launcher);

最终app页面显示如下

代码下载 androiddataBinding使用-Android文档类资源-CSDN下载

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值