Android DataBinding布局的加载深入探究

yizhihongxing

Android DataBinding布局的加载深入探究

什么是DataBinding

DataBinding 是在Android数据驱动开发中增强UI绑定的一项新功能,简化了通过代码获取视图变量的步骤,同时实现了单项和双向数据绑定。

DataBinding核心类

ViewDataBinding

ViewDataBinding 是DataBinding中的核心类,它是一个抽象类,其他所有的 DataBinding 类都是它的子类。ViewDataBinding可以理解为我们绑定一个layout文件的关键类,这个类可以根据layout文件生成对应的:@Binding类。其它的Binding类只是@Binding类的继承类,主要是针对全局变量的问题进行优化。

理解Binding类

Binding类是由过你定义的xml文件(BR)自动生成,例如我们定义了一段xml片段

< TextView android:id="@+id/showname"
           android:text="@{user.name}" />

对于这段xml,会自动生成一个 Binding 类:

public abstract class ItemUserBinding extends ViewDataBinding {
    @NonNull
    public final TextView showname;
    //....  

    //这里可以看到生成的变量 showname,通过 showname 可以直接去操作对应的 View .

    protected ItemUserBinding(Object _bindingComponent, View _root, int _localFieldCount) {
        super(_bindingComponent, _root, _localFieldCount);
        final Object[] bindings = mapBindings(_root, _localFieldCount, sIncludes, sViewsWithIds);
        this.showname = (TextView) bindings[0];
    }

    //....
}

这个类包含 View 和 UI 中使用的变量与布局。当您需要更新 View 的值时,直接从生成的 Binding 类中访问它们。

DataBinding的使用

第一种使用方式:在布局文件中使用DataBinding

我们知道,在普通的布局文件中直接使用 ${ } 表达式绑定变量。在使用 DataBinding 的布局文件中:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

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

在 Activity 中使用 DataBinding:

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding dataBinding; //这里为生成的ActivityMainBinding绑定类

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //获取DataBinding对象
        dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        User user = new User("hongtao", "123456");
        //将user对象与DataBinding中定义的user绑定
        dataBinding.setUser(user);
    }
}

第二种使用方式:在代码中使用DataBinding

方法一:手动引用布局并初始化DataBinding对象

ActivityMainBinding dataBinding = ActivityMainBinding.inflate(layoutInflater, null, false);
setContentView(dataBinding.getRoot());

User user = new User("hongtao", "123456");
dataBinding.setUser(user);

方法二:使用DataBinding.bind()

ActivityMainBinding dataBinding = DataBindingUtil.bind(findViewById(android.R.id.content));

User user = new User("hongtao", "123456");
dataBinding.setUser(user);

下面通过代码示例进一步了解DataBinding的使用

示例一:Button绑定监听事件

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
tools:context=".MainActivity">

    <data>
        <variable
            name="message"
            type="String" />
    </data>

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

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="@{() -> customOnClick()}"/>

    </LinearLayout>

</layout>
ActivityMainBinding dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
dataBinding.setMessage("Button点击");
dataBinding.setCallback(new MainActivityCallback());

class MainActivityCallback {
    public void customOnClick() {
        Toast.makeText(MainActivity.this, "Click Button!!!", Toast.LENGTH_SHORT).show();
    }
}

示例二:RecyclerView绑定数据

RecyclerView 是Android中一个通过 Adapter 提供数据并显示数据的 View。

<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="adapter"
            type="com.example.databinding.recyclerview.MainAdapter" />
    </data>

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

        <androidx.recyclerview.widget.RecyclerView
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
            app:adapter="@{adapter}"
            android:layout_Width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>

</layout>
//新建一个Adapter
class MainAdapter extends RecyclerView.Adapter<MainAdapter.MyViewHolder> {
    private List<User> users;
    private Context mContext;

    public MainAdapter(Context context, List<User> data) {
        this.mContext = context;
        this.users = data;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
        ItemUserBinding binding = DataBindingUtil.inflate(inflater, R.layout.item_user, viewGroup, false);
        return new MyViewHolder(binding);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        User user = users.get(position);
        holder.binding.setUser(user);        
    }

    @Override
    public int getItemCount() {
        return users.size();
    }

    //Binding类ViewHolder
    class MyViewHolder extends RecyclerView.ViewHolder {
        ItemUserBinding binding;

        public MyViewHolder(ItemUserBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
        }
    }
}

//Activity
ActivityMainRecyclerViewBinding recyclerViewBinding = DataBindingUtil.setContentView(this, R.layout.activity_main_recycler_view);
List<User> users = new ArrayList<>();
users.add(new User("hongtao", "123456"));
users.add(new User("jiangyan", "654321"));
users.add(new User("xiaohui", "111111"));
MainAdapter mAdapter = new MainAdapter(MainActivity.this, users);
//将Adapter与DataBinding中定义的adapter绑定
recyclerViewBinding.setAdapter(mAdapter);

参考资料

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android DataBinding布局的加载深入探究 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • phpcms V9二级目录下分页路径不正确问题的彻底解决方法

    下面我将为你详细讲解“phpcms V9二级目录下分页路径不正确问题的彻底解决方法”的完整攻略。 问题描述 当我们把phpcms V9放置在站点的非根目录下时,就会出现分页路径不正确的问题。原因是phcms V9默认使用的是根目录路径,而没有考虑站点放置的目录。例如,我们的站点放置在www.example.com/cms目录下,当我们访问分页时,路径会变成w…

    other 2023年6月27日
    00
  • PHP Global变量定义当前页面的全局变量实现探讨

    PHP Global变量定义当前页面的全局变量实现探讨 在PHP中,全局变量是在整个脚本中都可访问的变量。然而,如果我们只想在当前页面中定义全局变量,可以使用$GLOBALS数组来实现。本攻略将详细讲解如何使用$GLOBALS数组来定义当前页面的全局变量,并提供两个示例说明。 步骤1:定义全局变量 要定义当前页面的全局变量,可以使用$GLOBALS数组。该数…

    other 2023年7月28日
    00
  • Win2003 server 最大支持多少内存

    Win2003 Server 最大支持多少内存攻略 Windows Server 2003是一款老版本的服务器操作系统,其对内存的支持有一定限制。下面是详细的攻略,包括了两个示例说明。 1. 确定操作系统版本 首先,需要确定你所使用的Windows Server 2003的具体版本。Windows Server 2003有多个版本,包括Standard、En…

    other 2023年8月2日
    00
  • Win7 32位系统电脑不能复制粘贴右键粘贴选项是灰色的

    问题描述: 有用户反映,他的Win7 32位系统电脑不能复制粘贴,右键粘贴选项是灰色的,无法选择,这给他的工作带来了一定的麻烦,请问如何解决此问题? 解决方法: 1.检查剪贴板服务是否启动 首先我们需要排除剪贴板服务未启动的可能性,可以按下win+r组合键,在弹出的运行窗口中输入services.msc并回车打开服务管理器,找到Distributed Tra…

    other 2023年6月27日
    00
  • 使用redisTemplate从redis获取所有数据

    以下是使用redisTemplate从Redis获取所有数据的完整攻略: 导入依赖:在项目中添加Redis相关的依赖,例如Spring Data Redis。 配置Redis连接:在Spring配置文件中配置Redis连接信息,包括主机名、端口号、密码等。 创建RedisTemplate对象:在Java代码中创建RedisTemplate对象,并设置连接工厂…

    other 2023年10月18日
    00
  • 全面解读Spring Boot 中的Profile配置体系

    针对“全面解读Spring Boot中的Profile配置体系”的问题,我会根据以下内容来进行讲解: 什么是Profile配置体系? Profile配置体系的作用是什么? 如何配置和使用Profile配置体系? 示例演示 1. 什么是Profile配置体系? 在Spring Boot中,Profile配置体系是一种配置方式,它允许我们为不同的环境定义不同的配…

    other 2023年6月25日
    00
  • 如何解决“指定的服务已被标记为删除”错误

    在Windows系统中,有时候在尝试启动或停止服务时,可能会遇到“指定的服务已被标记为删除”错误。这个错误常是由于服务已被删除,但是其配置信息仍然存在于系统中所导致的。本文将详细讲解如何解决“指定的服务已被标记为删除”错误,包括使用方法和示例说明。 解决“指定的服务已被标记为删除”错误 要解决指定的服务已被标记为删除”错误,可以使用以下方法: 方法一:使用命…

    other 2023年5月7日
    00
  • mvc:default-servlet-handler的理解

    在Spring MVC中,mvc:default-servlet-handler是一种配置方式,用于将请求转发给Servlet容器的默认Servlet。以下是mvc:default-servlet-handler的完整攻略: 1. 理解mvc:default-servlet-handler 在Spring MVC中,mvc:default-servlet-h…

    other 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部