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

一、优化了什么问题

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

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

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

//扩展函数
fun Int.getColor(): Int {
    return ContextCompat.getColor(appContext, this)
}

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

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

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

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

/**
 * 设置文本的颜色,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中使用

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

在ImageView中使用

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

其他控件类似。

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

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
img
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓(文末还有ChatGPT机器人小福利哦,大家千万不要错过)

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题

图片

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值