个人认为扩展方法和扩展属性存在的意义就是自己去弥补原生API的不足,方便程序员开发,减少一些无聊的模板代码,提升代码的可读性,所以分享几个写项目我必添加的扩展方法和属性。
一、扩展方法和扩展属性的写法
1、扩展方法
fun Object.name(parm){
//做一些处理
}
函数里面可以调用被扩展类的属性和方法,完之后Object对象就可以调用name()方法了。
2、扩展属性
Object.name:Object //第一个Object是被扩展的类 第二个Object是扩展的属性类型
get(){
//做一些处理
return Object //属性类型
}
Object对象就有了name属性。
如果这些放在某个类里面,那么只能这个类或者子类使用,一般我们都需要全局使用,所有需要放到一个不包含类的kt文件里,比如Extension.kt,这样就变成静态方法可以全局调用。
二、日志打印
fun Any?.log(tag: String= "TAG"){
if(BuildConfig.IS_DEBUG){//只在debug环境下打印
if(this == null)
Log.d(tag,"null")
else {
Log.d(tag, this.toString())
}
}
}
要打印日志原始写法真的太麻烦了,直接给Any添加扩展方法,再加上参数设置默认值,任何对象都能方便的打印日志:
object.log()
"哈哈哈".log()
1.log("number")
三、输入框内容监听
原生的写法就是写个匿名类实现TextWatcher接口,该接口有三个方法,但绝大部分情况只需要用到其中的onTextChanged方法,每次写三个方法实在太影响美观了,可以这么做:
fun EditText.setTextChangedListener(call:(String)->Unit){
this.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
call.invoke(p0.toString())
}
override fun afterTextChanged(p0: Editable?) {
}
})
}
输入框调用setTextChangedListener扩展方法,使用起来就简单清晰很多了:
et.setTextChangedListener {
it.log()
}
四、输入框过滤空格
有的输入框要求不能输入空格,比如账号密码输入框,结合上一个扩展方法很容易实现:
fun EditText.notSpace(){
this.setTextChangedListener {
if(it.contains(" ")){
this.setText(it.replace(" ","",true))
this.setSelection(this.text.length)
}
}
}
使用方法
binding.etPassword.notSpace()
五、设置控件是否可见
原生的写法是:
view.visibility = View.VISIBLE//可见
view.visibility = View.GONE//不可见
这样太麻烦了,想直接设置ture和false,那么可以这么扩展:
fun View.visible(boolean: Boolean){
if(boolean){
this.visibility = View.VISIBLE
}else{
this.visibility = View.GONE
}
}
用法就是:
view.visible(false)
view.visible(true)
舒服!