Android databinding的接入使用与详解(一)

2023-11-12

一、介绍

         DataBinding 是Google Android组件框架,管理view和data之间进行绑定。DataBinding主要管理数个布局文件,这样我们就不用去实例化layout的view。直接通过DataBindingUitl来完成初始化。

这样可以精简代码,也减少工作量,避免view的空指针等。大量减少Activity/fragment模块内的代码,DataBinding 将数据实现单向或双向绑定到 layout 文件中,有助于防止内存泄漏,而且能自动进行空检测以避免空指针。

二、如何使用

1、引入DataBinding的库

只要在模块的build文件下,android{}节点内,新增如下

dataBinding {
    enabled = true
}

这样就开启了dataBinding库,同步一下项目,将库同步到本地

2、布局的创建与布局文件生成

1.新建一个布局文件叫:layout_databinding_simple

关于DataBinding绑定layout的有两种方式

第一种:IDE自动完成

             将鼠标移到布局代码上,会有黄色灯提示,然后选择Convert to data binding layout

IDE工具将会把layout的布局自动完成转码

 第二种:手动完成

把根布局换成layout,然后原来的root布局不变,在布局顶部新增data节点

<?xml version="1.0" encoding="utf-8"?>
<layout>

    <data>

        
    </data>

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/text_value"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </FrameLayout>
</layout>

3、布局文件生成对应的代码文件

布局设置好后,IDE会自动生成对应的文件

layout name:layout_databinding_simple

生成文件名:LayoutDatabindingSimpleBinding,格式就是布局文件名后缀接Binding

注意:关于这个文件生成,好多技术博客并没有介绍,只是简单的说了一句,导致好多新手找不到后缀为Binding的文件。

手动设置data生成的文件名

<data class="MyTestData">

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

只要在data节点下,设置class的name,data会生成用户自定义的文件,否则会采用系统默认方法。

    lateinit var data:MyTestData;

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        data=DataBindingUtil.setContentView<MyTestData>(this, R.layout.layout_databind_data)
    }

4、加载布局文件,生成对应的控制器

通过DataBindingUtil工具类完成view的设置与加载

var databinding = DataBindingUtil.setContentView<LayoutDatabindingSimpleBinding>(
    this,
    R.layout.layout_databinding_simple
)

1.setContentView<T>

T:泛型直接传布局layout生成的对应类LayoutDatabindingSimpleBinding,

加载完后,view 已完成了初始化,包括内部,直接通过databinding管理view和data

5、ViewDataBinding介绍

ViewDataBinding是view和data的管理类,如果你在

如果你在layout中有一个TextView id为 textname,那么直接就可以databinding.textname获取对象

如果你在layout data数据节点下有一个name 为name的节点,可以通过databinding.setName()设置数据源

在layout中绑定的数据,都是通过ViewDataBinding来设置与更新的

1.更新数据

<data>

</data>

2.获取view

获取的view,直接关联到对应的id,如果没有申明id,那么将不会出现在binding中

5、数据绑定

数据源的绑定至关重要,离开数据源,view也没有什么实际价值。

如何简单的绑定数据源呢?

1.设置数据源

简单类型,复杂类型,用户自定义,简单类型,在Java.lang包下,无须导入,可以直接使用,非简单内容,在使用时都需要导入对应的包,如下:

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

    <data>

        <import type="com.example.wiik.testdemo.databinding.data.MyPerson" />



        <variable
            name="person"
            type="MyPerson" />

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

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

        <variable
            name="sex"
            type="Boolean" />



    </data>

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

        <Button
            android:id="@+id/btn_click"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="点击" />

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

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="姓名 :" />

            <TextView
                android:id="@+id/textname"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{name}" />
        </LinearLayout>

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

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="年纪 :" />

            <TextView
                android:id="@+id/textage"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{age}" />
        </LinearLayout>


    </LinearLayout>
</layout>

data节点下有两个

1.import :导入变量的解决路径,和包中引入是一个概念

                import是导致类,提供给variable使用,但是import也可以给导入的类提供自定义变量名:alias

        <import
            alias="MyDaya"
            type="com.example.wiik.testdemo.databinding.data.Data" />

alias:是解决import自定义变量名。我们知道,相同包名下,不可以出现同一文件名,如果我们在不同的包名下都有Data类,通过import导入到xml布局,发现类名已存在,这时我们通过alias自定义一个变量名即可解决。


        <variable
            name="data"
            type="MyDaya" />

2.variable:变量的申明,name=定义名称,type:类型

2.view数据绑定

如果view的数据需要绑定,那么数据源来源于data节点下的设置。

绑定数据的格式:@{变量}

1.绑定复杂数据 :@{person.name}

2.简单直接引用data name即可

       <TextView
                android:id="@+id/textage"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{age}" />

三、错误处理

如果出现以下错误,在生成的文本中

        这是因为layout的布局生成对应的java或者kt文件失败。因为layout的data节点或者view在引用时出现错误,

排查

1、删除view中数据的引用@{}

        删除数据关联,然后同步数据,看是否排查完

2、data节点数据引用出错

        第一步排查完还没有解除,开始排查data节点,注销复杂的数据类型,查看variable 节点下的type是否可以关联到代码,如果关联不到,说明type类型有误

        第二看import是否正确,直接通过ide关联代码,如果能正常跳转说明关联正常。

以上排查完后,再同步一下ide工具,重新生成对应的文件即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android databinding的接入使用与详解(一) 的相关文章

  • 检测到设备正在振动?

    我使用下面的代码来振动设备 public void vibrator try Vibrator vibrator Vibrator getSystemService Context VIBRATOR SERVICE vibrator vib
  • Android SoundPool 堆限制

    我正在使用 SoundPool 加载多个声音剪辑并播放它们 据我所知 它的功能 100 正确 但在 load 调用期间 我的日志中充斥着以下内容 06 09 11 30 26 110 ERROR AudioCache 23363 Heap
  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • Android libgdx 首选项丢失

    我在 Libgdx 引擎中创建了 Android 游戏 一段时间后 我注意到在某些应用程序杀手中杀死该应用程序后 或者如果我在 Android 设置中执行 强制关闭 操作 我保存到首选项中的游戏选项就会丢失 有办法防止这种情况吗 我从来没有
  • KitKat(及更低版本)设备上的 Android Material Design

    我将在我们学校开发一个 Android 应用程序作为一个项目 我想使用 Google 的新 Material Design 但我知道它仅适用于 Android L 设备 Jack Underwood 最近发布了名为 Today Calend
  • (Ionic 2)尝试回退到 Cordova-lib 执行时发生错误:TypeError:无法读取未定义的属性“then”

    Edit 使用 ionic 2 时会发生这种情况 我知道它还不稳定 但我认为可能有一些解决方案 因为其他人似乎没有遇到这个问题 Edit end 由于某种原因 我在尝试使用 ionic build android 和 ionic build
  • RxJava、Proguard 和 sun.misc.Unsafe

    我有以下问题RxJava 1 1 0 使用时Proguard 我没有更改 RxJava 版本或其 pro文件 但更新后OkHttp我无法编译使用Proguard因为我有关于sun misc Unsafe不在场 rxJava pro keep
  • 接近语法错误(代码1)插入Android SQLite

    我正在创建一个通讯录应用程序 用户可以在其中输入姓名 电子邮件地址和号码 我希望将此数据保存在数据库中 但我似乎无法使插入方法起作用 我收到的错误是 android database sqlite SQLiteException near
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • 从 Firebase 数据库填充微调器

    public class MainActivity extends AppCompatActivity DatabaseReference reference Spinner areaSpinner ArrayList
  • Android 启动器快捷方式

    我制作了一个简单的打卡 打卡时钟应用程序 我想向用户添加在主屏幕上创建快捷方式的选项 该快捷方式将切换应用程序的状态 超时 超时 但我根本不希望此快捷方式在屏幕上打开应用程序 这是我的 setupShortcut private void
  • MediaCodec 创建输入表面

    我想使用 MediaCodec 将 Surface 编码为 H 264 使用 API 18 有一种方法可以通过调用 createInputSurface 然后在该表面上绘图来对表面中的内容进行编码 我在 createInputSurface
  • Android构建apk:控制MANIFEST.MF

    Android 构建 APK 假设一个 apk 包含一个库 jar 例如 foo jar 该库具有 META INF MANIFEST MF 这对于它的运行很重要 但在APK中有一个包含签名数据的MANIFEST MF 并且lib jar
  • 如何在不更改手机语言的情况下更改Android应用程序语言?

    我希望用户在应用程序内选择一种语言 选择语言后 我希望字符串使用特定语言 如果我更改手机语言 那么我的应用程序将以设置的语言运行 我无法找到任何在不更改手机语言的情况下设置语言的方法 此外 一旦设置了语言 更改就应该反映出来 有人可以建议一
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • 当手机旋转(方向改变)时如何最好地重新创建标记/折线

    背景 开发一个使用 Android Google Map v2 的本机 Android 应用程序 使用android support v4 app FragmentActivity 在 Android v2 2 上运行 客观的 在更改手机方
  • Android 如何聚焦当前位置

    您好 我有一个 Android 应用程序 可以在谷歌地图上找到您的位置 但是当我启动该应用程序时 它从非洲开始 而不是在我当前的城市 国家 位置等 我已经在developer android com上检查了信息与位置问题有关 但问题仍然存在
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想

随机推荐

  • Python习题答案

    1 多选题 程序设计语言包括 和 执行两种方式 正确答案 AB A 编译 B 解释 C 脚本 D 编写 2 单选题 机器语言是一种 语言 正确答案 A A 二进制 B 八进制 C 十进制 D 十六进制 3 单选题 是将源代码转换成目标代码的
  • sqli靶场通关之less9

    sqli less9 时间盲注 结合burpsuite 1 不返回报错信息页面 无法进行基于报错信息的盲注 2 页面不存在true和false两种不同的页面 无法进行对比也就无法进行布尔盲注 一般来说 在页面没有任何回显和错误信息提示的时候
  • 【Python基础】面向对象基础和特性

    Python面向对象 面向对象基础 定义类 创建对象 添加和获取对象属性 魔法方法 对象的生命周期 私有属性和私有方法 面向对象特性 封装 封装案例演练 继承 继承的传递性 方法的重写 父类的私有属性和私有方法 多继承 新式类与经典类 多态
  • 平摊分析(Amortized analysis)

    今天我们主要讨论所谓的平摊分析 amortized analysis 它是用来分析一系列操作的平均所需要的代价 可能有人会问它利用概率论的知识 通过概率来求平均情况 答案是否定的 它并不涉及概率 在一些情况下平摊分析能够很好的帮助我们分析我
  • 三进制数位和

    1 问题描述 问题描述 给定L和R 你需要对于每一个6位三进制数 允许前导零 计算其每一个数位上的数字和 设其在十进制下为S 一个三进制数被判断为合法 当且仅当S为质数 或者S属于区间 L R 你的任务是给出合法三进制数的个数 输入格式 一
  • eclipse下创建webService服务

    本博客是记录在eclipse开发环境中将一个方法开放出去 提供一个webService接口 可以通过浏览器访问 开发环境 eclipse 下载地址 http www eclipse org downloads eclipse package
  • Linux高级专题篇详解--Mysql大全(数据库详细介绍,mysql类型,编译安装,yum安装,增删改查,权限管理,日志备份恢复,主从复制,mycat读写分离)

    Day01 一 数据库介绍 1 什么是数据库 数据库就是一个存放计算机数据的仓库 这个仓库是按照一定的数据结构 数据结构是指数据的组织形式或数据之间的联系 来对数据进行组织和存储的 可以通过数据库提供的多种方法来管理其中的数据 2 数据库的
  • android 编译时copy so文件

    因为项目只支持armeabi 而有些第三方库不支持armeabi 所以在编译时将v7 v8 so文件copy到armeabi 直接上代码build gradle中添加如下代码 afterEvaluate project gt android
  • 华为OD机试真题-数列描述-2023年OD统一考试(B卷)

    题目描述 有一个数列a N N 60 从a 0 开始 每一项都是一个数字 数列中a n 1 都是a n 的描述 其中a 0 1 规则如下 a 0 1 a 1 11 含义 其前一项a 0 1是1个1 即 11 表示a 0 从左到右 连续出现了
  • 【python简单介绍】

    1 Python起源与定义 Python 是由荷兰人吉多 罗萨姆于 1989 年发布的 Python 的第一个公开发行版发行于 1991 年 Python 的官方定义 Python 是一种解释型的 面向对象的 带有动态语义的高级程序设计语言
  • ORA-01799 列不能外部联接到子查询

    现有学生 考试 分数三张表 1 学生表 记录学生的学号 姓名 年龄 性别 2 考试表 记录考试及考试日期 3 学生分数表 记录学生考试分数 现在 想要查询最近一次考试每个学生的分数 查询sql如下 SELECT ST NAME SC SCO
  • 从头学Qt Quick(3)-- 用QML写一个简单的颜色选择器

    先看一下效果图 实现功能 点击不同的色块可以改变文字的颜色 实现步骤 一 创建一个默认的Qt Quick工程 二 添加文件Cell qml 这一步主要是为了实现一个自定义的组件 这个组件就是我们看到的那个色块 很明显定义成组件可以则兼UI的
  • STM32 USB DP/DM内置的上下拉电阻阻值

    根据USB协议 工作在主机模式 USB DP DM下拉到GND 工作在设备模式 上拉到VCC DP上拉表示高全速设备 DM上拉表示低速设备 STM32在Device模式只支持高速或全速 图片来源于 STM32F407数据手册 红色为示意 实
  • Ubuntu下搭建Android SDK开发环境(图文)

    1 安装JDK 点击打开链接参考这个就可以了 2 下载安装eclipse 这里的eclipse不能直接从ubuntu软件仓库中下载 那个软件仓库下载的eclipse在装ADT时会有问题 这里建议是从eclipse官网上下载 官网地址 htt
  • Linux的进程管理

    目录 1 概述 2 进程描述符 2 1 进程描述符的分配 2 2 进程描述符的存放 2 3 进程状态 2 4 进程上下文 2 5 进程家族树 3 进程的创建 4 进程的终结 5 线程的实现 1 概述 进程是执行期的代码 但是进程不止包括这样
  • 系统性考量【复盘】这件事儿

    文章目录 1 为什么要做复盘 意义是什么 2 制定指标 3 做好复盘 4 里程碑反馈 1 为什么要做复盘 意义是什么 每日复盘的意义 可以帮助我们节省精力 有一个稳定自己的结构 这个结构可以帮助我们更好的输出 更好的输入 更好的获取价值 在
  • 智能合约漏洞案例,DEI 漏洞复现

    智能合约漏洞案例 DEI 漏洞复现 1 漏洞简介 https twitter com eugenioclrc status 1654576296507088906 2 相关地址或交易 https explorer phalcon xyz t
  • IOS xcode使用自带模板Tab bar Controller创建主页

    前面写过一篇类似的android版本 是使用的Bottom Navigation Activity结合Fragment创建APP的主页 IOS端的更简单 直接使用Tab bar Controller就可以了 一 创建Tab bar Cont
  • 技术至简-1:信源编码VS信道编码

    信源编码 用最精炼最简洁的语言文字表达最复杂的含义 目的是节省 纸张 信道编码 用啰嗦冗余的语言文字 注解表达简单的信息 目的是确保信息万无一失
  • Android databinding的接入使用与详解(一)

    一 介绍 DataBinding 是Google Android组件框架 管理view和data之间进行绑定 DataBinding主要管理数个布局文件 这样我们就不用去实例化layout的view 直接通过DataBindingUitl来