安卓开发-控件自定义属性

# 安卓开发-控件自定义属性

今天,看完这篇文章,你就知道属性的来龙去脉了,你自己也可以给控件定义相关的属性。在你以后自己写的控件时,对外提供可设置的属性是很有必要的。

# 什么是控件的属性呢?

比如说宽高呀,内容,背景,颜色,这些都是控件的属性。

而在布局中,我们是这么设置的:

20191121_142213.png

同时,控件还会提供对应属性的getter和setter的方法,比如说上图的TextView,就有setText的方法,getText的方法。其他的属性同事。

# 自定义属性的步骤

知道了什么是自定义属性,那我们怎么去写属于自己的属性呢?江湖上称 为自定义属性。

我们希望可以把这个过程量化,步骤化,这样子就解决了部分同学无从下手的问题了。

# 1、在res/values下创建attrs.xml文件夹

20191121_143432.png

attrs就是属性的意思,attributes

# 2、声明属性名称和值的类型

以我们轮播图为例子,视频地址:

自定义属性课程 (opens new window)

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="looper_style">
        <attr name="is_title_show" format="boolean" />
        <attr name="show_pager_count" format="enum">
            <enum name="single" value="1" />
            <enum name="multi" value="3" />
        </attr>
        <attr name="switch_time" format="integer" />
    </declare-styleable>
</resources>
1
2
3
4
5
6
7
8
9
10
11

format都有哪些类型呢?

20191121_145824.png

  • Integer,比如说行数,TextView的maxLine,就是Integer类型
  • enum,枚举类型,比如说gravity,left,top,bottom,center,right这些是枚举类型
  • boolean,布尔类型,比如说layout_alignParentRight
  • dimension,尺寸比如说size,margin_left这些,单位为px,dp,sp这些
  • color,这个大家都清楚了,颜色嘛,比如说background,比如说textColor
  • flags,标记,比如说我们学习activity声明周期时的configChanges
  • float,浮点数,也就是小数,比如说,透明度alpha
  • fraction,百分数,比如说动画的开始位置,fromDx
  • refrence,引用,比如说background,src,有同学可能有疑问了,background可以是color又可以是refrence,怎么整呢? 其实是可以多个的哈,比如说:name="switch_time" format="integer|float",可以是Integer类型,或者float类型
  • string,这个最简单了,比如说text,对吧

# 3、获取属性值

前面的不同类型,获取方式不一样,还是我们的轮播图里的例子:

     TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.looper_style);
        //从TypedArray中读取属性值
        //......
        ta.recycle();
1
2
3
4

根据类型,获取对应的值

      TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.looper_style);
        //从TypedArray中读取属性值
        mIsTitleShow = ta.getBoolean(R.styleable.looper_style_is_title_show,true);
        mPagerShowCount = ta.getInteger(R.styleable.looper_style_show_pager_count,1);
        mSwitchTime = ta.getInteger(R.styleable.looper_style_switch_time,-1);
//        Log.d(TAG,"mIsTitleShow -- > " + mIsTitleShow);
//        Log.d(TAG,"mPagerShowCount -- > " + mPagerShowCount);
//        Log.d(TAG,"mSwitchTime -- > " + mSwitchTime);
        ta.recycle();
1
2
3
4
5
6
7
8
9

# 4、使用属性

20191121_152633.png

# 5、测试属性的获取

把注释打开,运行结果:

D/SobLooperPager: mIsTitleShow -- > false
D/SobLooperPager: mPagerShowCount -- > 3
D/SobLooperPager: mSwitchTime -- > 4000
1
2
3

在控件里获取到了,你爱咋用就咋用呀。

上次更新: 2021/09/26, 21:50:22