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

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

作者: BlueSocks | 来源:发表于2023-12-13 22:21 被阅读0次

    一、优化了什么问题

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

    其他控件类似。

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/nxjigdtx.html