自定义控件的构造方法及相关属性的理解

来源:互联网 发布:银监会 网络借贷 银行 编辑:程序博客网 时间:2024/05/02 04:55

自定义控件的构造方法

继承View的控件有四个构造方法:

1、View(Context context)
2、View(Context context, @Nullable AttributeSet attrs)
3、View(Context context, @Nullable AttributeSet attrs, int defStyleAttr)
4、View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes)

这里先说说在自定义控件的时候,这些构造方法该怎么使用:

1、当我们的控件不需要在布局文件中使用时,这些构造方法就随便你使用了;

2、要是控件需要在布局文件中使用时,在自定义控件的时候必须重写两个参数的构造方法,这里解释下为什么,首先我们如果想用到控件在layout中的相关属性,必须通过AttributeSet attrs(表示从layout文件中直接为这个view添加的属性的集合)这个参数来获取;其次,我们在activity中调用setContentView的时候,实际内部会调用LayoutInflater的inflate方法填充布局,这个方法里面实际会使用反射的方法调用每个view的含两个参数的构造方法:

View temp = createViewFromTag(root, name, inflaterContext, attrs);

具体可以去看看源码哈。

接下来就是在构造方法里面获取控件在layout的相关属性,作控件的初始化等操作了。


自定义控件的相关属性的获取及使用

我们要获取控件在layout中的相关属性是通过以下的方法:

1、obtainStyledAttributes(@StyleableRes int[] attrs)//获取应用设置主题中attrs中的属性
注:也就是获取你的application标签下的android:theme设置的主题的attrs中的属性;
2、obtainStyledAttributes(@StyleRes int resid, @StyleableRes int[] attrs)//获取resid(资源文件style)中的attrs属性
3、obtainStyledAttributes(AttributeSet set,        @StyleableRes int[] attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes)
注:祥见后文
4、obtainAttributes(AttributeSet set, int[] attrs)这个方法官方的解释是:
* Retrieve a set of basic attribute values from an AttributeSet, not* performing styling of them using a theme and/or style resources.
这个因为平时基本没有用过,他不同于方法1、2、3,方法1、2、3实际上都是去获取主题(theme)或样式(style)
中的属性,这个方法看这个的解释,貌似不能获取这些,而是一些基本的属性,这个是什么意思呢,猜想是比如android:layout_width;
只是猜想哈,没有用过,先留在这里了,后面有机会再来填上。

那么对于属性的获取(上述方法三)到底是怎么回事呢?

相关参数解释:

AttributeSet set:属性的集合

int[] attrs:希望得到的属性

int defStyleAttr:当前主题提供的属性的索引

int defStyleRes:定义好的样式(style)资源的索引


在一般的使用过程中,

set:是我们定义在attrs.xml文件中的declare-styleable,其中包含一个或多个自定义的attr属性,在layout布局中我们为我们自定义的attr赋值;

attrs:一般都是null,表示并不指定获取哪些属性;

defStyleAttr:在多数情况下,我们在自定义控件时,对于defStyleAttr都是传一个0进去,传0表示什么意思呢?看看官方的解释:

defStyleAttr An attribute in the current theme that contains a*        reference to a style resource that supplies default values for*        the view. Can be 0 to not look for defaults.
什么意思呢?就是为这个控件提供了一个默认值,这个默认值是当前主题的一个属性,这个属性包含了一个样式的索引。说了半天,你就说这个玩意儿怎么用嘛!别人给你说了这是一个属性的索引,所以也是在attrs.xml的一个attr属性,只是这个属性是一个样式的索引,我们的程序一般会有个主题样式(android:theme),我们可以在这个主题样式中为这个attr设置具体的系统或自定义样式,这样在layout布局中,没有给控件设置其他样式的时候,控件就会使用我们设置的defStyleAttr属性,defStyleAttr为0表示不设置默认属性。

defStyleRes:读取资源文件中的某个样式。


优先级如下:
set>defStyleAttr(主题可配置样式)>defStyleRes(默认样式)>NULL(主题中直接指定)

0 1