一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情。
string.xml
资源id快速转换String
定义如下扩展属性:
val Int.resToString: String
get() = MainApp.mApplication.getString()
复制代码
使用起来就很方便了:R.string.xxx.resToString
View
隐现设置
平常设置View显隐的方式this.visibility = View.xxx
有点麻烦,封装下:
fun View.hide() {
this.visibility = View.GONE
}
fun View.show() {
this.visibility = View.VISIBLE
}
复制代码
使用起来:view.hide()
、view.show()
。我们项目中还有根据判断条件设置View显隐的逻辑,针对这个再封装下:
fun View.showIf(isShow: Boolean) {
if (isShow) {
show()
} else {
hide()
}
}
复制代码
设置View
背景颜色
先直接封装下面两个扩展属性:
- 将String类型的颜色值转换成Int值
val String.color: Int
get() = Color.parseColor(this)
复制代码
- 快捷设置
View
背景
inline var View.bgColor: String
get() = ""
set(value) {
setBackgroundColor(value.color)
}
复制代码
最后就可以这样使用了:
mBinding.root.bgColor = "#00ff00"
复制代码
::
成员引用
之前写的一篇文章你需要懂的Kotlin开发技巧之三有提到怎么判断一个lateinit var
的属性有没有初始化使用的是:this::age.isInitialized
,这个::
是什么呢?这个其实和java中的成员引用
差不多。
data class Student(@JvmField val name1: String = "") {
fun getName() = name1
}
复制代码
- 引用属性
比如
Student::name1
这种就是引用属性,我们看下Student::name1
是个什么东东:
是一个KProperty1
类型的属性,泛型中的第一个类型代表当前属性所在的类,第二个类型代表属性值的类型,有点类似于属性反射,需要传入Student
才能拿到name1
的内容:
我们看下KProperty1
这个类:
KProperty1
提供了get
方法帮助我们获取到值,再看下它的父类对象:
继续看下父类的父类:KCallable
:
这里面的属性是不是很熟悉,都是大家常用到的判断一个属性是否为抽象、是否可被子类重写、是否是延迟初始化属性
等等
如果是在类内部引用类的属性,比如this::xxx
,返回的类型将是一个Kproperty0
类型:
我们熟悉的isInitialized
判断属性是否初始化的就是Kproperty0
的一个扩展方法:
- 引用方法 方法引用这个使用起来也很普遍,我在之前文章基于BRVAH和RecycleView封装适配器时就使用到了,直接将其转换成函数类型作为构造参数进行传递。
我们看下Student::getName
通过类引用方法的是个什么东西:
可以看到这就是一个KFunction1
对象,如果引用的方法中带有一个参数呢:
就变成了KFunction2
了:
也就是说,随着方法的参数增加,::
方法引用的类型值也在不断变化KFunction数字
,但是不管类型怎么变化,都会实现同一个接口KFunction
:
是不是很熟悉,我们可以通过这个来判断方法是否为内联方法、中缀方法、运算符重载方法、协程挂起方法
等等。而且KFunction
也实现了KCallable
,我们也可以用来判断方法是否抽象、open
的等等
总结
关于kotlin相关的知识系列陆陆续续已经写了十篇文章了,基本上总结了Kotlin使用的过程中一些注意点以及使用技巧,这里就不粘贴其他的文章链接了,大家有兴趣可以关注下下面的专栏:Kotlin演义
。
后续就计划准备研究下Sequence
及其内部机制、Kotlin反射元编程等相关知识了。