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 = {   //防止重复点击的点击事件
        
    }
}

其他控件类似。

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

相关推荐
石山岭5 小时前
自己动手写了一个 Android 虚拟定位 App:GPSSimulate 技术实
android·前端
杉氧7 小时前
副作用 (Side Effects) 全攻略:如何像大师一样掌控 Composable 的生命周期?
android·架构·android jetpack
Kapaseker12 小时前
Kotlin Toolchain 0.11 发布:主要是把 Amper 干没了
android·kotlin
三少爷的鞋13 小时前
Android 现代架构不需要事件总线进阶篇
android
杉氧1 天前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏1 天前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧1 天前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄1 天前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android
落魄Android在线炒饭1 天前
Android Framework 开发技巧:android.jar 生成与系统快速编译验证
android
如此风景1 天前
Kotlin Flow操作符学习
android·kotlin