View 自定义 - 属性 Attribute

一、概念 

在 xml 中为控件设置的属性。自定义属性名称如果使用系统已定义的,例如 textSize 会在编译时报错。

格式类型 定义/使用

string 字符串

android:myContent = "Hello Word!"

color 颜色

android:myTextColor = "#00FF00"

dimension 尺寸

android:myTextSize = "12.sp"

reference 资源

android:myBackground = "@drawable/图片ID"

boolean 布尔

android:myEnable = "true"

float 浮点

android:myAlpha = "0.5F"

integer 整型

android:myMaxLines = "3"

fraction 百分比

android:myOffset = "10%"

enum 枚举

       

        

android:myOrientation = "vertical"

flag 位运算

位运算类型的属性在使用的过程中可以使用多个值

       

        

        

android:myGravity = "top|left"

混合类型

属性定义时可以指定多种类型值

android:myBackground = "@drawable/图片ID"

android:myBackground = "#00FF00"

二、自定义步骤

2.1 创建资源文件(属性声明)

右键 values 目录 -> New File文件 -> 一般取名attrs.xml。


    
    
        
        
        
        
        
        
        
        
            
            
        
    

2.2 构造函数中配置

constructor(context: Context?) : super(context)

重写一个参数的构造函数,使用场景:代码 new 创建实例的时候调用。

constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)

重写两个参数的构造函数,使用场景:xml中使用时调用(xml转java代码的时候反射)。

constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

重写三个参数的构造函数,使用场景:使用主题Style的时候调用。

class MyView : View {
    private var text: String? = null
    private var textSize: Int? = null
    private var textColor: Int? = null
    private var maxLength: Int? = null
    private var background: Int? = null
    private var inputType: Int? = null

    //改成this调用2个参数的构造
    constructor(context: Context?) : this(context, null)
    //改成this调用3个参数的构造
    constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0)
    //在这里统一进行处理
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
        context?.let {
            //返回一个与attrs中列举出的属性相关的数组,数组里面的值由样式属性指定
            val attributes = it.obtainStyledAttributes(attrs, R.styleable.MyView)
            //获取自定义属性(格式:属性名称_条目名称)
            text = attributes.getString(R.styleable.MyView_myText)
            textSize = attributes.getDimensionPixelSize(R.styleable.MyView_myTextSize, 0)
            textColor = attributes.getColor(R.styleable.MyView_myTextColor, Color.BLACK)
            maxLength = attributes.getInt(R.styleable.MyView_myMaxLength,1)
            background = attributes.getResourceId(R.styleable.MyView_myBackground,R.drawable.ic_launcher_foreground)
            inputType = attributes.getInt(R.styleable.MyView_myInputType,0)
            //回收资源
            attributes.recycle()
        }
    }
}

2.3 布局中使用(属性使用)

  • 根布局添加命名空间(只需要输入app,IDE会自动补全)。
  • 控件名称使用完整路径(只需要输入自定义View的类名,IDE会自动补全)。
  • 未自定义的属性View会去处理(继承自View),使用自定义的属性就是 app: 开头的。


    
    

你可能感兴趣的:(View,android)