Android 开发小技巧:属性扩展让代码写起来更轻松更易读

一、优化了什么问题

在Android开发中经常碰到设置文本颜色、背景色、背景资源等,每次都要写一大堆代码,如下所示:

kotlin 复制代码
button.apply {
    background = ContextCompat.getDrawable(this@MainActivity,R.drawable.dinosaur)
    setBackgroundColor(ContextCompat.getColor(this@MainActivity,R.color.black))
}

写多了脑壳痛,那能不能像前端语言那样简洁优雅呢?之前见过一种写法就是对Int进行扩展,就会看到奇奇怪怪的代码,如下:

kotlin 复制代码
//扩展函数
fun Int.getColor(): Int {
    return ContextCompat.getColor(appContext, this)
}

//调用
button.apply {
    setBackgroundColor(R.color.purple_700.getColor())
}

那能不能把一些常用的设置控件UI的方法都改造成setter访问方法呢?

二、通过扩展属性使代码更易写易读

在XML中常用的基础控件有TextView、ImageView、Button、EditText,那先从这几个控件入手就可以了。扩展属性只能在类的基础上添加属性,并不能覆盖,这一点需要注意。只需要下面几个扩展属性的方法,代码写起来就会舒服和易读很多。

kotlin 复制代码
/**
 * 设置文本的颜色,Button、EditText、TextView都用此方法设置textColor
 */
var TextView.textColor: Int
    get() {
        return this.textColors.defaultColor
    }
    set(value) {
        this.setTextColor(ContextCompat.getColor(this.context, value))
    }

/**
 * 给View设置drawable和mipmap资源
 * 常见的控件都是继承View,所以都能用
 */
var View.backgroundResource: Int?
    get() = 0    //get方法无意义返回0
    set(value) {
        if (value == null) {
            //去掉背景
            this.background = null
        } else {
            this.background = ContextCompat.getDrawable(this.context, value)
        }
    }

/**
 * 给View设置背景颜色
 * 常见的控件都是继承View,所以都能用
 */
var View.backgroundColor: Int
    get() {
        return (this.background as ColorDrawable).color
    }
    set(value) {
        this.setBackgroundColor(ContextCompat.getColor(this.context, value))
    }

/**
 * 给ImageView设置drawable和mipmap资源
 */
var ImageView.imageResource: Int?
    get() = 0    //get方法无意义返回0
    set(value) {
        if (value == null) {
            //去掉图片
            this.setImageDrawable(null)
        } else {
            this.setImageDrawable(ContextCompat.getDrawable(this.context, value))
        }
    }

/**
 * 点击事件。可防止重复点击。
 * ClickUtils.OnDebouncingClickListener是AndroidUtilCode库中的方法,项目中一般都有
 */
var View.onClick: (View) -> Unit
    get() = {}     //get方法无意义返回空的lambda
    set(value) {
        this.setOnClickListener(object : ClickUtils.OnDebouncingClickListener() {
            override fun onDebouncingClick(v: View) {
                value.invoke(v)
            }
        })
    }

在TextView中使用

kotlin 复制代码
textView.apply {
    text = getString(R.string.app_name)
    //设置文本颜色
    textColor = R.color.white
    textSize = 15F
    //设置背景颜色
    backgroundColor = R.color.black
    onClick = {   //防止重复点击的点击事件
        
    }
}

在ImageView中使用

kotlin 复制代码
imageView.apply {
    //设置背景颜色
    backgroundColor = R.color.black
    //设置背景资源
    backgroundResource = R.drawable.dinosaur
    //设置src资源
    imageResource = R.drawable.dinosaur
    //如果项目中有创建Drawable的方法可以继续用background
    background = shape(Shape.RECTANGLE) {
        solid(R.color.white))
        corners(8F.dp2px)
    }
    onClick = {   //防止重复点击的点击事件
        
    }
}

其他控件类似。

上面只是改造了常见控件的常用属性的写法,让代码写起来更简洁,更易读,并且添加了防止重复点击的方法,不至于在其他页面又写类似的逻辑。

相关推荐
闲暇部落1 小时前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
诸神黄昏EX3 小时前
Android 分区相关介绍
android
大白要努力!4 小时前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
Estar.Lee4 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
Winston Wood4 小时前
Perfetto学习大全
android·性能优化·perfetto
Dnelic-7 小时前
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
android·junit·单元测试·android studio·自学笔记
Eastsea.Chen10 小时前
MTK Android12 user版本MtkLogger
android·framework
长亭外的少年17 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿19 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神21 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri