自定义控件的构造方法
继承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
(主题中直接指定)