databinding学习

简介: 构建环境 android{ dataBinding{ enabled = true}}数据绑定布局文件 上面data标签里声明数据变量,数据类...

构建环境

  android{
  dataBinding{
  enabled = true
}
}

数据绑定布局文件

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"/>
   </LinearLayout>
</layout>

上面data标签里声明数据变量,数据类型可以是POJO类,也可以是JavaBeans类

绑定数据

默认情况下,将根据布局文件的名称生成一个Binding类,所以可以利用这个bingding类做绑定操作
例:

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
   User user = new User("Test", "User");
   binding.setUser(user);
}

也可以通过以下几种方式获取binding实例

  • MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());
  • ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
  • ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

事件处理

两种方式

  • 方法引用:先在要绑定的数据类里声明事件要触发的方法,然后布局里直接调用声明的方法,比如:
public class MyHandlers {
    public void onClickFriend(View view) { ... }
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="handlers" type="com.example.Handlers"/>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"
           android:onClick="@{handlers::onClickFriend}"/>
   </LinearLayout>
</layout>

不过这种需要View控件已有onClick方法,而且也要注意方法的View参数对应上

  • 监听器绑定

在方法引用中,方法的参数必须与事件侦听器的参数相匹配。在侦听器绑定中,只有您的返回值必须与侦听器的预期返回值相匹配(除非它是期望的void)

public class Presenter {
    public void onSaveClick(Task task){}
}
  <?xml version="1.0" encoding="utf-8"?>
  <layout xmlns:android="http://schemas.android.com/apk/res/android">
      <data>
          <variable name="task" type="com.android.example.Task" />
          <variable name="presenter" type="com.android.example.Presenter" />
      </data>
      <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
          <Button android:layout_width="wrap_content" android:layout_height="wrap_content"
          android:onClick="@{() -> presenter.onSaveClick(task)}" />
      </LinearLayout>
  </layout>

可以注意到xml的onClick后面使用的lambda表达式,所以也可以写成: android:onClick="@{(view) -> presenter.onSaveClick(task)}"

布局详情

imports

可直接导入类
例:

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

为什么?因为下面的控件标签要用
例:

<TextView
   android:text="@{user.lastName}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

如果导入多个类,但类名相同,可以加个alias=""用于区分
也可以在声明variable时type类型名全部加上

自定义binding类名字

在data标签里 加class可改

<data class="ContactItem">
    ...
</data>
<data class=".ContactItem">
    ...
</data>
<data class="com.example.ContactItem">
    ...
</data>

包含

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:bind="http://schemas.android.com/apk/res-auto">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <include layout="@layout/name"
           bind:user="@{user}"/>
       <include layout="@layout/contact"
           bind:user="@{user}"/>
   </LinearLayout>
</layout>

表达式

  • 数字的+ - /* %
  • 字符串 +
  • 逻辑 && ||
  • 二进制 & | ^
  • 一元 + - ! ~
  • 转移 >> >>> <<
  • 比较 == > < >= <=
  • instanceof
  • Grouping()
  • 子面
  • cast
  • 方法调用
  • 域访问
  • 数组访问
  • 三元: ?:

android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'
  • 空合并运算符(??)选择左操作数,如果它不为空,或者如果为空则选择右操作数。

android:text="@{user.displayName ?? user.lastName}"
= android:text="@{user.displayName != null ? user.displayName : user.lastName}"

数据绑定

目录
相关文章
|
XML 前端开发 JavaScript
Android MVVM模式入门 - DataBinding的使用
Android MVVM模式入门 - DataBinding的使用
414 0
|
ARouter 前端开发 Java
MVVM架构结合阿里ARouter,打造一套Android-Databinding组件化
前言 关于Android的组件化,相信大家并不陌生,网上谈论组件化的文章,多如过江之鲫,然而一篇基于MVVM模式的组件化方案却很少。
1973 0
|
6月前
|
存储 前端开发 测试技术
Android Kotlin中使用 LiveData、ViewModel快速实现MVVM模式
使用Kotlin实现MVVM模式是Android开发的现代实践。该模式分离UI和业务逻辑,借助LiveData、ViewModel和DataBinding增强代码可维护性。步骤包括创建Model层处理数据,ViewModel层作为数据桥梁,以及View层展示UI。添加相关依赖后,Model类存储数据,ViewModel类通过LiveData管理变化,而View层使用DataBinding实时更新UI。这种架构提升代码可测试性和模块化。
209 2
|
7月前
|
Android开发 Kotlin
Android面试题 之 Kotlin DataBinding 图片加载和绑定RecyclerView
本文介绍了如何在Android中使用DataBinding和BindingAdapter。示例展示了如何创建`MyBindingAdapter`,包含一个`setImage`方法来设置ImageView的图片。布局文件使用`&lt;data&gt;`标签定义变量,并通过`app:image`调用BindingAdapter。在Activity中设置变量值传递给Adapter处理。此外,还展示了如何在RecyclerView的Adapter中使用DataBinding,如`MyAdapter`,在子布局`item.xml`中绑定User对象到视图。关注公众号AntDream阅读更多内容。
110 1
|
8月前
|
Android开发 Kotlin
android开发,使用kotlin学习ViewModel
android开发,使用kotlin学习ViewModel
145 0
|
8月前
|
Android开发 Kotlin
android开发,使用kotlin学习Fragment
android开发,使用kotlin学习Fragment
154 0
|
Android开发 容器
Android ViewModel与LiveData组件组合使用详解
Android ViewModel与LiveData组件组合使用详解
154 0
|
安全
浅析viewBinding和DataBinding
viewBinding 优点 配置 使用 源码解析 DataBinding 配置 创建实体类 创建布局 创建viewModel dataBinding绑定
535 0
浅析viewBinding和DataBinding
DHL
|
XML 前端开发 算法
竟然如此简单,DataBinding 和 ViewBinding
ViewBinding 和 DataBinding 为我们解决了这么多问题,但是为什么很多小伙伴们不愿意使用 ViewBinding 和 DataBinding,今天我们从使用的角度来分析。
DHL
611 0
竟然如此简单,DataBinding 和 ViewBinding
DHL
|
存储 算法 安全
如何在项目中封装 Kotlin + Android Databinding
如何在项目中封装 Kotlin + Android Databinding
DHL
335 0
如何在项目中封装 Kotlin + Android Databinding

热门文章

最新文章