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

其他控件类似。

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

相关推荐
selt7911 小时前
Redisson之RedissonLock源码完全解析
android·java·javascript
Yao_YongChao2 小时前
Android MVI处理副作用(Side Effect)
android·mvi·mvi副作用
非凡ghost3 小时前
JRiver Media Center(媒体管理软件)
android·学习·智能手机·媒体·软件需求
席卷全城3 小时前
Android 推箱子实现(引流文章)
android
齊家治國平天下3 小时前
Android 14 系统中 Tombstone 深度分析与解决指南
android·crash·系统服务·tombstone·android 14
maycho1235 小时前
MATLAB环境下基于双向长短时记忆网络的时间序列预测探索
android
思成不止于此5 小时前
【MySQL 零基础入门】MySQL 函数精讲(二):日期函数与流程控制函数篇
android·数据库·笔记·sql·学习·mysql
brave_zhao6 小时前
达梦数据库(DM8)支持全文索引功能,但并不直接兼容 MySQL 的 FULLTEXT 索引语法
android·adb
sheji34166 小时前
【开题答辩全过程】以 基于Android的网上订餐系统为例,包含答辩的问题和答案
android
easyboot6 小时前
C#使用SqlSugar操作mysql数据库
android·sqlsugar