Android DataBinding布局的加载深入探究

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日

相关文章

  • 完全了解php的callable

    以下是关于“完全了解PHP的callable”的完整攻略,过程中包含两个示例。 背景 在PHP中,callable是一种特殊的数据类型,用于表示可以被调用的函数或方法。在使用callable时,我们需要了解其基本语法和用法,以便正确地使用它。 基本原理 在PHP中,callable是一种特殊的数据类型,用于表示可以被调用的函数或方法。callable可以用于…

    other 2023年5月9日
    00
  • 苹果iOS 11 Beta1固件下载 苹果iOS 11开发者预览版Beta1固件下载地址汇总

    苹果iOS 11 Beta1固件下载攻略 随着苹果公司在2017年的全球开发者大会(WWDC)上发布了最新的移动操作系统——iOS 11,很多的iOS开发者都十分关心苹果iOS 11 Beta1固件下载问题。本文将为您提供苹果iOS 11 Beta1固件下载的完整攻略。 1. 判断是否需要下载iOS 11 Beta1固件 首先,您需要搞清楚是否需要下载iOS…

    other 2023年6月26日
    00
  • 关于android:如何在edittext中更改线条颜色

    关于Android:如何在EditText中更改线条颜色 在Android中,可以通过修改EditText的样式来更改其线条颜色。以下是关于如何在EditText中改线条颜色的完整攻略: 使用XML样式更改线条颜色 可以使用XML样式来更改EditText的线条颜色。可以按照以下步骤进行: 在res/values/styles文件中定义EditText的样式…

    other 2023年5月8日
    00
  • js数组删除问题(splice和delete的用法)

    当我们在使用JavaScript编写网页时,常常需要对数组进行操作,其中删除数组元素就是一个常见的需求。JavaScript中提供两个用于删除数组元素的方法:splice和delete。本文将对这两个方法的用法进行详细讲解。 一、splice方法 splice方法用于删除数组中的元素,并可在删除元素后将另外的元素插入到删除元素的位置上。其基本用法如下: ar…

    other 2023年6月25日
    00
  • jdbc的驱动包下载

    当然,我可以为您提供“JDBC的驱动包下载”的完整攻略,过程中包含两条示例说明。攻略如下: JDBC的驱动包下载 JDBC是Java数据库连接的标准API,它允许Java用程序与各种关系型数据库进行交互。在使用JDBC之前,您需要下载适当的JDBC驱动程序。在本教程中我们将介绍如何下载JDBC驱动程序。 步骤1:确定您的数据库类型 首先,您需要确定您要连接的…

    other 2023年5月9日
    00
  • Linux外围文件系统的定制方法

    下面我将为你详细讲解“Linux外围文件系统的定制方法”的完整攻略,包含以下几部分内容: 确定外围文件系统的定制的目的; 选择适合的文件系统类型; 可定制区域确定; 开始进行定制; 两个示例说明。 1.确定外围文件系统的定制目的 在进行外围文件系统的定制之前,我们需要明确外围文件系统的定制目的。确定目的后,我们可以针对需求进行相应的定制。 2.选择适合的文件…

    other 2023年6月27日
    00
  • numpy由float转换为int 取最近的整数

    NumPy由float转换为int取最近的整数攻略 在NumPy中,可以使用astype()函数将float类型的数组转换为int类型的数组,并取最近的整数。本攻略中,我们将详细介绍如何使用astype()函数将float类型数组转为int类型的数组,并取最近的整数。 步骤1:创建float类型的数组 在使用astype()函数将float类型的数组换为in…

    other 2023年5月6日
    00
  • 前端性能优化成神之路–ssr(服务端渲染)

    前端性能优化成神之路–ssr(服务端渲染) 前端性能优化一直是前端开发中的重要话题,其中服务端渲染(SSR)是一种优化前端性能的有效方式。本攻略将详细讲解SSR的基本概念、使用方法和示例说明。 SSR的基本概念 服务端渲染(SSR)是指在服务器端将动态页面生成HTML字符串,然后将其发送到客户端进行展示。传统的客户端渲染(CSR)相比,SSR可以高页面的加…

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