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
背景颜色先直接封装下面两个扩展属性:
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
的一个扩展方法:
我们看下Student::getName
通过类引用方法的是个什么东西:
可以看到这就是一个KFunction1
对象,如果引用的方法中带有一个参数呢:
就变成了KFunction2
了:
也就是说,随着方法的参数增加,::
方法引用的类型值也在不断变化KFunction数字
,但是不管类型怎么变化,都会实现同一个接口KFunction
:
是不是很熟悉,我们可以通过这个来判断方法是否为内联方法、中缀方法、运算符重载方法、协程挂起方法
等等。而且KFunction
也实现了KCallable
,我们也可以用来判断方法是否抽象、open
的等等
关于kotlin相关的知识系列陆陆续续已经写了十篇文章了,基本上总结了Kotlin使用的过程中一些注意点以及使用技巧,这里就不粘贴其他的文章链接了,大家有兴趣可以关注下下面的专栏:Kotlin演义
。
后续就计划准备研究下Sequence
及其内部机制、Kotlin反射元编程等相关知识了。