Android开发必看:一文教你完全理解DataBinding框架(下

name=“user”
type=“com.imyyq.databindingtest.User”
/>

变量肯定可以定义多个啦,泛型的尖括号需要转义。

3. 自定义自动生成的类名称

默认的 Binding 生成类规则是:xml 的名称去掉下划线,再首字母大写,最后尾部加个 Binding,比如 activity_main,自动生成的类就是:ActivityMainBinding,那么如果你想自定义这个名字呢?如下:

于是自动生成的类就变成了 HeiHei,还可以指定包名:cn.xxx.HeiHei,奇奇怪怪的知识又增加了。

4. 支持 include 标签

<layout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:app=“http://schemas.android.com/apk/res-auto”
xmlns:tools=“http://schemas.android.com/tools”

<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”
tools:context=“.MainActivity”



其中 layout_test 如下:

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


<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”

5. 支持 ViewStub 标签

布局如下:

<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“horizontal”



view_stub.xml 如下:

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


<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“horizontal”



代码如下:

// 设置 inflate 回调
mBinding.viewStub.setOnInflateListener(new ViewStub.OnInflateListener()
{
@Override
public void onInflate(ViewStub stub, View view)
{
// 得到 Binding 实例
ViewStubBinding binding = DataBindingUtil.bind(view);
User user = new User(“liang”, “fei”);
binding.setUser(user);
}
});

// isInflated 是 DataBinding 自动生成的方法,不是 ViewStub 的方法。可用于判断是否已 inflate
if (!mBinding.viewStub.isInflated())
{
mBinding.viewStub.getViewStub().inflate();
}

这个特别有用,因为可以判断 ViewStub 是否已经 inflate。

6. 支持双向绑定

比如 EditText,绑定了 LiveData,当 EditText 内容改变的时候,LiveData 的内容也会跟着变化。如下:

关键就是 @={},如此一来,我们就可以直接在 ViewModel 中取得 EditText 的内容数据了,因为 ViewModel 是不可以持有 View 实例的,所以如果没有 DataBinding,要获取 EditText 就只能通过 View 传给 ViewModel。有了 DataBinding 就方便多啦。

内置支持双向绑定的属性如下:

当然我们还可以自定义双向绑定的,后面再来说这个。

7. 支持绑定方法

上面我们的所有操作,都是绑定的变量,能绑定方法吗?当然可以。我们通过 onClick 事件来举例。

val onClick = View.OnClickListener {
Log.i(“MainViewModel”, “commonLog - onClick: 变量”)
}

fun onClick(v: View) {
Log.i(“MainViewModel”, “commonLog - onClick: 方法”)
}

fun onClick() {
Log.i(“MainViewModel”, “commonLog - onClick: 没有参数,或者有参数也行,但是 xml 中也必须给它传对应的值”)
}

其中双冒号 :: 绑定方法的签名必须和属性要求的对象方法签名一致。这里即 OnClickListener 的 onClick 方法。同样的,如果是 onLongClick 监听,那就要求你的方法有返回 Bool 值了。

第三种是表达式的写法,我们下面会说,学过 Java8 的都知道箭头 -> 和双冒号 :: 是 Lambda 表达式。

8. 支持表达式

DataBinding 支持部分表达式,还支持 Lambda 表达式,如上的点击事件,但是建议不要过于复杂,因为 DataBinding 不支持单元测试的,报错也不是很智能。支持的运算符和关键字如下:

没有 this、super、new 和显式泛型调用。示例如下:

android:text=“@{String.valueOf(index + 1)}”
android:visibility=“@{age > 13 ? View.GONE : View.VISIBLE}”
android:transitionName=‘@{“image_” + id}’
android:transitionName=“@{image_ + id}”

String 是无需 import 的,因为是 java.lang 包下的,但是 View 就需要了,见上面的导入 import 说明。

如果需要内嵌字符串,那么需要用单引号包裹。或者使用 `` 符号包裹,如上。

(1) 双问号,三元运算符的简化

android:text=“@{user.displayName ?? user.lastName}”

displayName 不为 null,则使用 displayName,否则使用 lastName。

(2) 访问集合、数组等元素

跟访问数组一样,用 [] 括号访问,比如:

android:text=“@{list[index]}”
android:text=“@{map[key]}”

如果是 map 类型的,甚至可以这样:map.key,就跟访问属性一样。而且会自动强转,如果你的 value 不是字符类型的,DataBinding 会强转为符合 text 属性的类型。

(3) 访问资源

比如说 strings,dimens,color 等

android:padding=“@{large? @dimen/largePadding : @dimen/smallPadding}”
android:text=“@{@string/nameFormat(firstName, lastName)}”
android:text=“@{@plurals/banana(bananaCount)}”

如果是自定义的 View,比如有个 set 方法参数要求是 Drawable,而 xml 中无法配置 Drawable 对象,只能是 int 型的资源地址,那么就需要自定义转换器了,转换器下面说。

9. 避免空指针异常

如下绑定:

android:text=“@{String.valueOf(user.age)}”

如果 user 是空的,不会引发空指针异常,DataBinding 会根据变量的类型,自动设置默认值,比如 age 是 int,那么默认值是 0,不仅是字段,方法也一样。

10. 使用其他 View 的值

tv_msg 会自动生成 tvMsg 字段,因此可以直接调用相关方法。

11. 在 Preview 窗口显示视图的默认值

注意,这里说的预览窗口的视图,而不是真实运行时的视图,我们经常需要在预览窗口预览视图,比如 TextView,有两种方法可以设置。如下:

其中 tools 的优先级较高,同时设置则显示 tools 设置的内容。

12. 在非 UI 线程更改数据

如果绑定的是 LiveData,那么在子线程更新数据,可以使用 postValue。

如果绑定的是 ObservableXxxx 类型的,其 set 方法也可以直接在子线程中调用,DataBinding 支持在子线程中改变数据,也能响应到 UI 上,而且是线程安全的,不过不可以是集合类型的,比如 ObservableArrayMap,是线程不安全的。

因此如果是集合类型的数据,则应该统一在主线程更改数据。

13. 列表绑定

建议采用第三方绑定库:binding-collection-adapter,可以很方便的实现列表绑定。

如果是自己写 Adapter,最关键的地方就在于使用 setVariable 和 executePendingBindings 方法刷新数据,这里就不展开叙述了,需要自行搜索吧。

14. 转换器

举个例子,比如你有个 float 值,需要设置给 TextView 的 text 属性,而 text 要求是字符串,很明显 float 不符合要求,那么就可以定义一个转换器,将 float 转成 String,如下:

package com.imyyq.sample

import androidx.databinding.BindingConversion

@BindingConversion
fun convert(value: Float?) = value?.toString() + “我列个去”

入参是待转换的类型,出参是转换后的类型,即 Float 和 String。

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司21年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

详细整理在GitHub可以见;

Android架构视频+BAT面试专题PDF+学习笔记​

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-tQgVzMgp-1710961924773)]
[外链图片转存中…(img-aOhwYCOn-1710961924773)]
[外链图片转存中…(img-0Gq9bx6i-1710961924773)]
[外链图片转存中…(img-6K1ma3Qr-1710961924774)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-lM61dxJq-1710961924774)]

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值