android开发分享在Android中如何使用DataBinding详解(Kotlin)

前言本问主要介绍databinding在android app中的使用方法。数据绑定是将“提供器”的数据源与“消费者”绑定并使其同步的一种通用技术。1. android应用程序使用数据绑定1.1 介绍


前言

本问主要介绍databinding在android app中的使用方法。数据绑定是将“提供器”的数据源与“消费者”绑定并使其同步的一种通用技术。

1. android应用程序使用数据绑定

1.1 介绍databinding

android通过databinding提供了编写声明型布局的支持。这样可以最大程度简化布局和逻辑相关联的代码。
数据绑定要求修改文件,外层需要包裹一个layout布局。主要通过@{} 或 @={}语法把布局中的元素和表达式的引用写入到属性中。

  <?xml version="1.0" encoding="utf-8"?>  <layout xmlns:android="https://schemas.android.com/apk/res/android"   xmlns:app="https://schemas.android.com/apk/res-auto"   xmlns:tools="https://schemas.android.com/tools">     <data>    <variable     name="mainmodel"     type="me.ithome.jetpack.model.mainviewmodel" />①   </data>     <androidx.constraintlayout.widget.constraintlayout    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".mainactivity">②      <textview     android:id="@+id/tv_userinfo"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:text="@{mainmodel.userdata.tostring()}"     app:layout_constraintbottom_tobottomof="parent"     app:layout_constraintleft_toleftof="parent"     app:layout_constraintright_torightof="parent"     app:layout_constrainttop_totopof="parent" />      <button     android:id="@+id/button"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:layout_margintop="56dp"     android:onclick="@{(view) -> mainmodel.getclick(view)}"     android:text="@string/btn_getuserinfo"     app:layout_constraintbottom_totopof="@+id/tv_userinfo"     app:layout_constraintend_toendof="parent"     app:layout_constrainthorizontal_bias="0.498"     app:layout_constraintstart_tostartof="parent"     app:layout_constrainttop_totopof="parent" />     </androidx.constraintlayout.widget.constraintlayout>  </layout>  

①用户变量,定义了能在这个布局里面使用的属性和类

②常规布局

databinding会基于layout创建一个binding class,这个类包含了布局属性(定义的变量)到相关视图的所有绑定,并且会为布局中的数据元素生成setter,生成的类的名称是基于layout的名称(驼峰命名,加上binding后缀)。比如布局名是activity_main.xml,生成的类就是activitymainbinding。你能通过这个类去inflate布局和数据模型,也可以通过databindingutil类。

databindingutils加载布局

  val mainbindingutil = databindingutil.setcontentview<activitymainbinding>(this, r.layout.activity_main)  mainbindingutil.lifecycleowner = this  

inflate加载布局(此方法也能用于recyclerview, viewpager)

  val mainbindingutil = activitymainbinding.inflate(layoutinflater)  setcontentview(mainbindingutil.root)  

上述两种方法大家二选一,一般在activity中我们都用第一种。

1.2 如何启用databinding

想要在android app工程中使用databinding,只需要在app/build.gradle文件中设置如下代码:

  android {   ....   databinding {    enabled = true   }  }  

1.3 databinding点击事件的处理

布局的处理除了数据的传递,还有点击事件的处理。

使用方式和普通方法调用一样。比如我在mainviewmodel.kt中定义了getclick方法

  fun getclick(v: view) {   //todo  }  

现在我想在button点击的时候调用getclick方法,只需要在布局文件中添加下面的代码

  android:onclick="@{(view) -> mainmodel.getclick(view)}"  

如果不需要参数,可以直接

  android:onclick="@{() -> mainmodel.getclick()}"  

如果有其他参数,对应的添加参数列表

  android:onclick="@{() -> mainmodel.getclick(args)}"  

其他比如onlongclick之类的处理都是同理。

1.4 import的使用

可以通过import的方式导入类,直接调用类的静态方法。

  <data>   <import type="me.ithome.jetpack.utils.stringutils" />   <variable    name="mainmodel"    type="me.ithome.jetpack.model.mainviewmodel" />  </data>    <textview   android:text="@{stringutils.capitalize(mainmodel.userdata.name)}"   android:layout_width="wrap_content"   android:layout_height="wrap_content"/>  

1.5 数据实时刷新

当viewmodel的数据发生变化后,我们希望布局也同时刷新,有个非常简单的方法,不需要继承baseobservable,我们通过引入livedata来实现。

  open class mainviewmodel : viewmodel() {      var userdata: mutablelivedata<userinfo> = mutablelivedata()      init {      getuserinfo()    }      private fun getuserinfo() {      val user = userinfo("李四", (10..50).random())      userdata.postvalue(user)  //数据发生变化后,调用postvalue,无需通过observe监听,布局数据会自动刷新    }      fun getclick(v: view) {      getuserinfo()    }  }  

1.6 使用bindingadapter

可以通过bindingadapter这个注解来实现属性值变化的时候,控件状态也跟着变化,比如图片imageview,当url变化的时候,控件会跟着显示不同的图片。

需要在静态类里面定义一个静态方法:

  object stringutils {      @bindingadapter("android:src")    @jvmstatic fun loadimage(view: imageview, url: string) {      myapplication._context?.let {        glide.with(it)          .load(url)          .into(view)      }    }  }  

注意这里的android:src,这个可以直接指定控件的属性,也可以自己定义属性。

  <imageview        android:id="@+id/imageview"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        app:layout_constraintbottom_tobottomof="parent"        app:layout_constraintend_toendof="parent"        app:layout_constraintstart_tostartof="parent"        app:layout_constrainttop_tobottomof="@+id/tv_userinfo"        android:src="@{mainmodel.imageurl}"        tools:srccompat="@tools:sample/avatars" />  

loadimage方法绑定的是android:src这个属性,所以当这个属性的值变化时会把view和url传递到loadimage。

如果是绑定的自定义字段呢?比如我现在绑定了一个自定义的url。

  @bindingadapter("url")  @jvmstatic fun loadimage(view: imageview, url: string) {  ...  }  

那么布局文件就这么写

  <imageview        android:id="@+id/imageview"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        app:layout_constraintbottom_tobottomof="parent"        app:layout_constraintend_toendof="parent"        app:layout_constraintstart_tostartof="parent"        app:layout_constrainttop_tobottomof="@+id/tv_userinfo"        app:url="@{mainmodel.imageurl}"        tools:srccompat="@tools:sample/avatars" />  

总结

前面主要是写了databinding的一些基本用法,扩展用法还比较多,我们后续再接着说。

到此这篇关于在android中如何使用databinding(kotlin)的文章就介绍到这了,更多相关android使用databinding(kotlin)内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/addevelopment/891827.html

(0)
上一篇 2021年10月19日
下一篇 2021年10月19日

精彩推荐