自定义控件6---自定义属性一

本文深入探讨了Android应用开发中自定义属性的分类、声明与获取方法,通过具体示例展示了如何在自定义视图中灵活运用自定义属性,提升用户体验与代码可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 自定义属性的分类
  • 自定义属性的声明
  • 自定义属性的获取

一:自定义属性的分类 

1reference参考指定Theme中资源ID,这个类型意思就是你传的值可以说引用资源
2string字符串,如果你想别人既能直接写值也可以用类似"@string/test"引用资源的方式,可以写成format="string/reference"
3color颜色
4dimension尺寸值
5boolean布尔值
6integer整型
7float浮点型
8fraction百分数
9enum枚举,如果你提供的属性只能让别人选择,不能随便传入
10flag位或运算

二:自定义属性的声明

通常在values目录下的attrs.xml,如下:

    <declare-styleable name="customVisitingCard">
        <attr name= "background" format ="reference|color" />
        <attr name= "name" fomat ="string" />
        <attr name= "nameColor" format ="color" />
        <attr name= "nameSize" format ="dimension" />
        <attr name= "isShowShadow" format ="boolean" />
        <attr name="age" format="integer" />
        <attr name="percentage" format="fraction" />
        <attr name="shadowX" format="float" />
        <attr name="style">  
            <enum name="STROKE" value="0"></enum>  
            <enum name="FILL" value="1"></enum>  
        </attr>
        <attr name="position">
        <flag name="boss" value="0" />
        <flag name="manager" value="1" />
        <flag name="employee" value="2" />
    </attr>
    </declare-styleable >

如果你想复用这些属性,那么可以这么声明:

    <attr name="background" format="reference|color" />
    <attr name="name" fomat="string" />
    <attr name="nameColor" format="color" />
    <attr name="nameSize" format="dimension" />
    <attr name="isShowShadow" format="boolean" />
    <attr name="age" format="integer" />
    <attr name="percentage" format="fraction" />
    <attr name="shadowX" format="float" />
    <attr name="style">  
            <enum name="STROKE" value="0"></enum>  
            <enum name="FILL" value="1"></enum>  
    </attr>
    <attr name="position">
            <flag name="boss" value="0" />
            <flag name="manager" value="1" />
            <flag name="employee" value="2" />
    </attr>

    <declare-styleable name="customVisitingCard">
        <attr name="background" />
        <attr name="name" />
        <attr name="nameColor" />
        <attr name="nameSize" />
        <attr name="isShowShadow" />
        <attr name="age" />
        <attr name="percentage" />
        <attr name="shadowX" />
        <attr name="style" />
        <attr name="position"/>
    </declare-styleable>

自定义属性的获取
自定义控件有三个构造方法

    public CustomProgressBar( Context context){
          super(context);    
    }
    public CustomProgressBar(Context context , AttributeSet attrs ){  
        super(context,attrs); 
    }
    public CustomProgressBar(Context context , AttributeSet attrs , int defStyle){
        super(context,attrs,defStyle); 
    }

如果在Code中实例化一个View会调用第一个构造函数,如果在xml中定义会调用第二个构造函数,而第三个函数系统是不调用的,要由View(我们自定义的或系统预定义的View,如此处的CustomTextView和Button)显式调用.
参考文章:Android中自定义样式与View的构造函数中的第三个参数defStyle的意义 - AngelDevil - 博客园

显然,要获取自定义属性,必须要在第二个和第三个构造方法中获取,获取方法

        TypedArray typedArray = context.obtainStyledAttributes(attrs,
                R.styleable.customVisitingCard);
//      TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs,
//              R.styleable.customVisitingCard,0,0);

        int count = typedArray.getIndexCount();
        for (int i = 0; i < count; i++) {
            int attr = typedArray.getIndex(i);
            switch (attr) {
            case R.styleable.customVisitingCard_background:
                if (typedArray
                        .hasValue(R.styleable.customVisitingCard_background)) {
                    Drawable background = typedArray.getDrawable(attr);
                    if (null != background) {
                        mBackground = background;
                    }
                }
                break;
            case R.styleable.customVisitingCard_name:
                mName = typedArray.getString(attr);
                break;
            case R.styleable.customVisitingCard_nameColor:
                mColor = typedArray.getColor(attr, Color.RED);
                break;
            case R.styleable.customVisitingCard_nameSize:
                mNameSize = typedArray.getDimensionPixelSize(attr,
                        (int) TypedValue.applyDimension(
                                TypedValue.COMPLEX_UNIT_PX, 20, getResources()
                                        .getDisplayMetrics()));
                break;
            case R.styleable.customVisitingCard_isShowShadow:
                mIsShowShadow = typedArray.getBoolean(attr, false);
                break;
            case R.styleable.customVisitingCard_age:
                mAge = typedArray.getInteger(attr, 0);
                break;
            case R.styleable.customVisitingCard_percentage:
                mPercentage = typedArray.getFraction(attr, 1, 1, 0f);
                break;
            case R.styleable.customVisitingCard_shadowX:
                mShadowX = typedArray.getFloat(attr, 0);
                break;
            case R.styleable.customVisitingCard_style:
                mStyle = typedArray.getInt(attr, 0);
                break;
            case R.styleable.customVisitingCard_position:
                mPosition = typedArray.getInteger(attr, 0);
                break;

            default:
                break;
            }
        }
        typedArray .recycle();

源码下载

引用:
android开发教程之自定义属性用法详解Android脚本之家
android自定义属性的使用 - 竹木人 - 博客园
Android中自定义属性的使用 - 无知者无畏 - ITeye技术网站

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值