Kotlin扩展属性和扩展函数在Android中的应用
2018-06-08 本文已影响36人
请你吃鱼
Java开发android时,如果要给一个TextView赋值会使用setText方法,有时候我们解析出来的字段获取不是一个,而是由多个字段拼接起来的,比如一个TextView显示地址需要省份+地区+县,但是如果是从服务器解析出来的数据并不能保证每个字段都有值,如果其中一个字段为空,得到的结果很可能就是这样的——河北省null南宫市。这样的效果对用户显然是不友好的,鬼知道null是个什么东西,怎么办呢?用Java的时候我们可以封装一个方法:
去除null
扩展属性
添加扩展属性时需要使用set和get方法,唯一的不同是在属性前面加上扩展的类型,这样在为TextView设置text时就会执行下面的方法来设置属性,可以这样使用:
扩展属性使用
,结果就自然把null替换掉了。
之前我们是给TextView扩展的,那可不可以给String类型扩展呢,答案是可以的。上面我们说的是扩展属性,接下来我们给String类型扩展一个名称为toNoNullString的方法:
扩展方法1
扩展方法2
我们知道在Java中如果一个空对象调用方法会出现NPE,在Kotlin中可空对象调用方法时需要加上?操作符,这样在对象为null时会返回null而不会报错,我们的扩展方法类型是String?,当调用的对象为null时会返回"",并且可空对象调用时不需要加?操作符:
扩展方法使用
以前调用toast时我们会在BaseActivity里扩展一个方法,同理我们可以为Activity封装一个方法:
toast
这样就可以直接在Activity中调用了,你可能还会注意到我使用了isNullOrBlank()这个方法,从名字上看应该是判断字符串是否为null的方法,当然如果命名规范的情况下这种方法在Java是不可能存在的,因为如果字符串为null早就报错了。不过由上面看我们知道在Kotlin中是可以的,就是使用扩展方法,通过源码也验证了我们的猜测:
isNullOrBlank
这篇文章的目的主要是为了介绍扩展属性和扩展函数的基本用法,更多用法还是需要结合自己的需求,今天就到这里,谢谢大家,再见!

但是每次给Textview设置内容时都要调用一下这个方法实在太麻烦了,有人说还可以用继承,继承谁呢?String显然是不可能的,我们可以继承TextView然后重写setText方法,但是每次在布局中使用的时候都要使用自己的TextView,还不如上一种方法简单。


之前我们是给TextView扩展的,那可不可以给String类型扩展呢,答案是可以的。上面我们说的是扩展属性,接下来我们给String类型扩展一个名称为toNoNullString的方法:


我们知道在Java中如果一个空对象调用方法会出现NPE,在Kotlin中可空对象调用方法时需要加上?操作符,这样在对象为null时会返回null而不会报错,我们的扩展方法类型是String?,当调用的对象为null时会返回"",并且可空对象调用时不需要加?操作符:


