欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

荐 每日一学——DataBinding的使用

程序员文章站 2022-04-15 20:55:38
DataBinding的实际使用看看DataBinding的简介在对应model的build.gradle中配置使用场景1.最简单的实体类与TextView的绑定2. 引入类,引用定义的方法进行判断操作等3. 点击事件的使用5. 集合、Map在xml布局中的使用看看DataBinding的简介DataBinding 是 Google 在 Jetpack 中推出的一款数据绑定的支持库,利用该库可以实现在页面组件中直接绑定应用程序的数据源,实现数据与View的双向绑定。此外,除了将数据与 UI 绑定在一起,...

看看DataBinding的简介

DataBinding 是 Google 在 Jetpack 中推出的一款数据绑定的支持库,利用该库可以实现在页面组件中直接绑定应用程序的数据源,实现数据与View的双向绑定。此外,除了将数据与 UI 绑定在一起,还要支持对数据及 UI 的变动观察,其中一个发生变动就需要同步到另一个上去,也就是同步。
荐
                                                        每日一学——DataBinding的使用

那么 DataBinding 对于整体架构、对于我们开发者来说到底意味着什么呢?由于 Android 开发语言的限制,最早期的 Android 开发都用 MVC 架构,导致代码臃肿不堪,难以维护,后来出现了 MVP 架构,代码倒是清晰了起来,但同样也存在过度设计、各种接口方法满天飞、内存泄漏的问题,导致很多人很难准确的使用 MVP。无论是 MVC 还是 MVP 或多或少都存在一些问题,始终无法找到一个完美的解决方案,其根本上是由于 Android 开发的模式本身导致的,我们需要先监听数据的变化,然后再将变化后的数据同步更新到 UI 上,这样的步骤我们一直在重复,MVC/MVP 本质上也没有解决这个问题,这样的重复性代码我们写了一次又一次。而 DataBinding 就是为了解决这个问题而存在的,我们只需要将数据绑定到 UI 元素上,更新数据时 UI 就会跟着改变,反之亦然,大大节省了我们的代码。
下面就来讲讲他是如何实现的。(摘要自大佬总结)

在对应model的build.gradle中配置

你可以在所有的Android平台最低能到Android 2.1(API等级7+)上使用它。
需求:Android Plugin for Gradle1.5.0-alpha1或更高版本。

 dataBinding{
        enabled=true
    }

结构如图:
荐
                                                        每日一学——DataBinding的使用

使用场景

下面开始介绍几种使用情景:我也没怎么用,用法还挺多,希望后面用多了能熟练吧,写法跟前端的js很相似。

1.最简单的实体类与TextView的绑定

activity里面绑定(fragment里面这么绑定binding = ActivityMainBinding.inflate(layoutInflater, null, false))

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding= DataBindingUtil.setContentView(this,R.layout.activity_main);
        UserBean userBean=new UserBean("张三",25,183232232);
        binding.setUser(userBean);
    }
}

xml布局代码:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="user"
            type="com.example.databinding.bean.UserBean" />
    </data>

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

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}" />

        <!--注意:这里age是int类型,必须转化为String,否则会运行时异常-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(user.age)}" />
    </LinearLayout>
</layout>

2. 引入类,引用定义的方法进行判断操作等

我们可以引入自己的写的工具类,以及需要的外部类到布局里面,直接调用

如下:通过判断年龄>10 隐藏显示TextView

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

    <data>

        <variable
            name="user"
            type="com.example.databinding.bean.UserBean" />

        <import type="android.view.View" />
    </data>

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

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}" />

        <!--注意:这里age是int类型,必须转化为String,否则会运行时异常-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(user.age)}"
            android:visibility="@{user.age>10?View.VISIBLE:View.GONE}" />
    </LinearLayout>
</layout>

以及定义一个工具类:


public class FormatUtils {
    //定义了一个简单的格式化时间的方法
    public static String formatTime(Date date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
        return simpleDateFormat.format(date);
    }
}

xml布局使用这个工具类:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="user"
            type="com.example.databinding.bean.UserBean" />
        <import type="android.view.View" />
        <import type="com.example.databinding.FormatUtils" />
    </data>

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

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}" />

        <!--注意:这里age是int类型,必须转化为String,否则会运行时异常-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(user.age)}"
            android:visibility="@{user.age>10?View.VISIBLE:View.GONE}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{FormatUtils.getDataFormat(user.date)}" />
    </LinearLayout>
</layout>

运行
荐
                                                        每日一学——DataBinding的使用

3. 点击事件的使用

public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        UserBean userBean = new UserBean("张三", 25, 183232232);
        binding.setUser(userBean);
        binding.setOnclickEvent(new OnclickEvent());
        binding.setTask(new OnclickEvent.Task());
    }


    public static class OnclickEvent {
        public void runTask(Task task) {
            task.run();
        }
        public void onClickFriend(View view) {
            if (view.getId() == R.id.btn_1) {
                Log.d("TAG", "点击了");
                Toast.makeText(view.getContext(), "button1被点击了", Toast.LENGTH_LONG).show();
            }
        }

        public void runTask(View view, Task task) {
            Toast.makeText(view.getContext(), "执行了传view的runTask", Toast.LENGTH_SHORT).show();
            task.run();
        }
        
        public static class  Task implements Runnable {
            @Override
            public void run() {
                Log.d("TASK", "子线程执行runTask");
            }
        }
    }

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="user"
            type="com.example.databinding.bean.UserBean" />

        <variable
            name="OnclickEvent"
            type="com.example.databinding.MainActivity.OnclickEvent" />

        <variable
            name="task"
            type="com.example.databinding.MainActivity.OnclickEvent.Task" />
        <import type="android.view.View" />
        <import type="com.example.databinding.FormatUtils" />
    </data>

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

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}" />

        <!--注意:这里age是int类型,必须转化为String,否则会运行时异常-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(user.age)}"
            android:visibility="@{user.age>10?View.VISIBLE:View.GONE}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{FormatUtils.getDataFormat(user.date)}" />

<!--        lambdal表达式写法-->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="一个参数"
            android:onClick="@{()->OnclickEvent.runTask(task)}"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="两个参数"
            android:onClick="@{(view)->OnclickEvent.runTask(view,task)}"/>

<!--        普通双引号写法-->
        <Button
            android:id="@+id/btn_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="两个参数"
            android:onClick="@{OnclickEvent::onClickFriend}"/>
    </LinearLayout>
</layout>

5. 集合、Map在xml布局中的使用

	```
		List<UserBean> list=new ArrayList<>();
        Map<String, UserBean> users = new HashMap();
        UserBean userBean1=new UserBean("李白",31,1213123121);
        UserBean userBean2=new UserBean("1212121",31,1213123121);
        list.add(userBean1);
        list.add(userBean2);
        users.put("1",userBean1);
        users.put("2",userBean1);
        binding.setIndex(1);
        binding.setUserList(list);
        binding.setKey("2");
        binding.setUserMap(users);

	```
  		```
        <import type="java.util.List" />
        <import type="java.util.Map" />
        <import type="com.example.databinding.bean.UserBean" />
        <variable
            name="userList"
            type="List&lt;com.example.databinding.bean.UserBean&gt;" />

        <variable
            name="index"
            type="java.lang.Integer" />

        <variable
            name="userMap"
            type="Map&lt;String,com.example.databinding.bean.UserBean&gt;" />
        <variable
            name="key"
            type="String" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        
<!--        集合-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{userList[index].name}"
            />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{userList.get(0).name}"
            />
  <!--  map中使用-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{userMap.get(key).name}"

            />
    </LinearLayout>
</layout>

其他使用场景我慢慢后续补充上!嘻嘻嘻嘻

本文地址:https://blog.csdn.net/Lemon_wzq/article/details/106660487

相关标签: Android进阶