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

其他控件类似。

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

相关推荐
小蜜蜂嗡嗡16 分钟前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi0022 分钟前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体
zhangphil2 小时前
Android理解onTrimMemory中ComponentCallbacks2的内存警戒水位线值
android
你过来啊你2 小时前
Android View的绘制原理详解
android
移动开发者1号5 小时前
使用 Android App Bundle 极致压缩应用体积
android·kotlin
移动开发者1号5 小时前
构建高可用线上性能监控体系:从原理到实战
android·kotlin
ii_best10 小时前
按键精灵支持安卓14、15系统,兼容64位环境开发辅助工具
android
美狐美颜sdk10 小时前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
恋猫de小郭15 小时前
Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持
android·开发语言·ios·kotlin
aqi0015 小时前
FFmpeg开发笔记(七十七)Android的开源音视频剪辑框架RxFFmpeg
android·ffmpeg·音视频·流媒体