注意在data
元素内添加了import
元素,表示导入该类型的定义,这样表达式中引用属性可读性高点,使用也方便。
来个容易掰的栗子:
通过导入View类型,就可以使用相关属性,例如这里的View.VISIBLE
。
有时导入的类全名太长了或者存在相同类型的类名,我们就可以给它取个别名,然后就可用别名进行coding~
使用资源
使用下面语法:
android:padding=“@{@dimen/largePadding}”
相关资源的的表达式引用,贴张官网截图:
事件处理
数据绑定库允许我们在事件到View时候通过表达式去处理它。 在数据绑定库中支持两种机制:方法调用和监听器绑定。
好想一笔带过,因为原文看不明白~~~~(>_<)~~~~
方法调用
点击事件会直接绑定到处理方法上,当一个事件发生,会直接传给绑定的方法。类似我们在布局上使用android:onclick
与Activity 的方法绑定。在编译的时候已经绑定,在@{}
表达式中的方法如果在Activity找不到或者方法名错误,就会在编译时期报错,方法签名(返回类型和参数相同)一致。
丢个栗子:
定义一个接口,用于处理事件。
//定义一个处理点击事件的类
interface MethodHandler {
fun onClick(view: View)
}
在布局声明了methodHandler变量,并在Button的onClick
方法使用表达式@{methodHandler::onClick}
,onClick
方法需要与上面接口一致,不然编译器期报错。
…
然后在Activity中实现MethodHandler,并赋值给绑定类的变量。
class MainActivity : AppCompatActivity(), MethodHandler{
lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
…
binding.methodHandler = this
}
override fun onClick(view: View) {
Log.i(TAG, “Method handling”)
}
}
因此,当我们点击Button的时候,Activity的onClick方法就会被回调。
监听器绑定
监听器绑定与方法调用不同的是,监听器不再编译器与处理方法绑定,而是在点击事件传递到当前view时,才与处理方法绑定,而且监听器并不要表达式方法名与处理方法同名,只要返回类型一致即可,如果有返回值得话。
来个栗子:
- 定义接口用于处理事件
interface ListenerHandler {
fun onClickListener(view: View)
}
- 在布局中定义变量和表达式
注意到使用lambda表达式,因此可以在@{}
内做更多操作,如预处理数据等。
- 处理方法 同样在Activity实现ListenerHandler方法,并赋值给绑定类的变量。
class MainActivity : AppCompatActivity(), ListenerHandler {
lateinit var binding: ActivityMainBinding
override fun onClickListener(view: View) {
Log.i(TAG, “Listener handling”)
}
override fun onCreate(savedInstanceState: Bundle?) {
…
binding.listener=this
}
}
点击Button,就能看到onClickListener回调了~
不过瘾的,看官网吧
好了,讲到这里,大家喝杯奶茶续命,休息会吧~
吃完瓜了没?吃完了就该继续撸文了,毕竟革命尚未成功~
绑定类
前面讲的大多数是在布局中去使用表达式,从这开始,讲点代码中的操作。在一开始入门时候,讲到会根据当前布局生成绑定类,绑定类类名由布局名称根据Pascal规则和添加Binding后缀生成。举个栗子就明白了,当前布局名称:activity_shared.xml。生成绑定类名称:ActivitySharedBinding。
那么绑定类的作用是什么?
绑定类是数据绑定库为让我们可以访问布局中的变量和视图而生成的类。
如何创建或者定制绑定类呢?
创建绑定类
- 使用静态inflate()方法
ActivityMainBinding.inflate(LayoutInflater.from(this))
重载版本
ActivityMainBinding.inflate(getLayoutInflater(), viewGroup, false)
- 使用静态bind()方法
//一般这种情况是布局有作其他用途
ActivityMainBinding.bind(viewRoot)
- 在Fragment,ListView,或RecyclerView的adapter使用
val listItemBinding = ListItemBinding.inflate(layoutInflater,
viewGroup, false)
// 或者
val listItemBinding = DataBindingUtil
.inflate(layoutInflater, R.layout.list_item,
viewGroup, false)
定制绑定类
通过修改data
元素的class属于达到定制不同名称的绑定类,和其所存储位置。
//生成绑定类名为:ContactItem,存放在当前组件的绑定类包中
…
//生成绑定类名为:ContactItem,存放在当前组件包中
…
//生成绑定类名为:ContactItem,存放在com.gitcode包中
…
访问Views
如果需要访问布局中Views,需要给Views添加id,数据绑定库会尽快通过findViewById去绑定。并在Activity中通过绑定类使用。例如:
binding.tvName.text=“GitCode”
访问变量
数据绑定库会为在布局中声明的变量在绑定类中生成setter和getter。例如:
binding.user=User(“GitCode”,3)
绑定类官网
绑定适配器
每个布局表达式都对应着一个绑定适配器,用于进行设置相应属性或监听器所需的框架调用.通俗点说,我们通过调用什么方法去给属性赋值?我们在代码通过setText()方法给view的text属性赋值。讲的就是下面的代码:
binding.tvAge.text=“20” //通过tvAge的setText()给TextView的android:text属性赋值
好像跟我们平常调用的没什么区别:
tvAge.text=“20”
这里讲的就是这个,当数据变化时,我们调用合适的方法(例如setText方法),去给view的属性赋值(例如android:text的text属性)。还不懂的话,继续看~
给View的属性赋值
数据绑定库提供三种方式让我们去给View的属性赋值:库自己决定选择调用方法;明确指定调用方法;自定义调用逻辑方法。
库自动选择
假如View有个属性color,库会尝试去查找setColor(args)方法,参数args的类型需要和表达式的返回类型一致。例如android:color=@{"black"}
,因为"black"
是字符串类型,所以args的参数类型就是String。命名空间android
并没有作强制要求,也可以是gitcode:color=@{"black"}
。库查找方法的标准是setXXX()
方法名和参数类型,这里的XXX
是指属性名。
明确指定
虽然库自动选择已经很智能了,但有时view的属性和方法名并不一致,这是就需要我们明确指定,避免库自动选择找不到。例如ImageView的android:tint
属性是关联到setImageTintList(ColorStateList)
方法,而不是setTint()
,这时,就需要明确指定了。
@BindingMethods(value = [
BindingMethod(
type = android.widget.ImageView::class,
attribute = “android:tint”,
method = “setImageTintList”)])
BindingMethods是注解在类上的,例如Activity。可以包含一个到多个BindingMethod注解。BindingMethod中type表示当前方法(method)匹配到到哪个View的属性(attribute)上。
定制逻辑方法
虽然上面两者已经满足了大多数情况,但一些特殊情况还是需要自己处理逻辑的。例如,view的android:paddingLeft
属性,没有setPaddingLeft(int)
方法,但提供了setPadding(left, top, right, bottom)
方法。这时候就需要我们自定义逻辑了。
@BindingAdapter(“android:paddingLeft”)
fun setPaddingLeft(view: View, padding: Int) {
view.setPadding(padding,
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
最后
给大家送上我成功跳槽复习中所整理的资料,由于文章篇幅有限,所以只是把题目列出来了
个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-fUAdWi88-1711777650460)]
最后
给大家送上我成功跳槽复习中所整理的资料,由于文章篇幅有限,所以只是把题目列出来了
[外链图片转存中…(img-z2kjEAPY-1711777650460)]
[外链图片转存中…(img-vnwkuWC3-1711777650460)]
[外链图片转存中…(img-xREsNZOf-1711777650461)]