android java 给控件设置style,android 自定义控件 使用declare-styleable进行配置属性(源码角度)...

declare-styleable:declare-styleable是给自定义控件添加自定义属性用的。

如果不知道如何查看源码:

起初,在自定义控件的时候,会要求构造3个方法中的一个或多个,好比我自定义的控件PersonView,

public PersonView(Context context) {

super(context);

// TODO Auto-generated constructor stub

}

public PersonView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

// TODO Auto-generated constructor stub

}

public PersonView(Context context, AttributeSet attrs) {

super(context, attrs);

}其中的AttributeSet attrs一般都没给它配置和使用,所以不知道这个东西到底怎么用,后来查看源码发现,这个配置在默认情况下使用的是系统自己的默认配置,一旦你直接设定了它的属性,默认属性就会被你的赋值所替代。

下面我们拿TextView的源码看看AttributeSet是如何进行操作的。

初始化时候,在布局文件中写android:text="拉拉";

db78ab7a7d07723ce2cf081ef6d52cf6.png

初始化TextView的时候,它的类中的属性都会初始化;

fcc5166c3fd3acba5c46864ba89f63eb.png

接着往下看,你可以看到以下代码:

TypedArray a = theme.obtainStyledAttributes(

attrs, com.android.internal.R.styleable.TextViewAppearance, defStyle, 0);

TypedArray appearance = null;

int ap = a.getResourceId(

com.android.internal.R.styleable.TextViewAppearance_textAppearance, -1);

a.recycle();

if (ap != -1) {

appearance = theme.obtainStyledAttributes(

ap, com.android.internal.R.styleable.TextAppearance);这个就是系统在默认的资源文件R.styleable中去获取相关的配置。

如果appearance不为空,它就会去寻找获取相关属性,接着往下看。

20e22d4bf747b5b32c09d0bb11148333.png

此时的text = "";     就是准备输出的字符串初始化。

之后它便会查找你布局文件XML中是否设定给了它text属性值

920cbb01e5c6bbc12b124c52f0c4c089.png

之前我们设定过android:text="拉拉";  所以它便会得到相关的赋值,之后调用

 setText(text, bufferType);

if (hint != null) setHint(hint);

输出该字符串。当资源检查赋值完毕后,调用a.recycle();释放。

同理也可以发现,像hint,textcolor这类属性都是这么初始化赋值的。

思路:

自定义控件并且自定义属性的情况下,你可以通过这样去获取判断是否配置了相关的属性,并进行赋值操作。

从源码那边我们大体知道了一个控件的属性配置和初始化流程,下面就让我们按照这个思路去自己学习下如何自定义配置。

下面我要写一个继承了TextView的PersonView类,给它设定属性配置,之后实现属性的显示。

1.首先,先写attrs.xml

在res-vlaues文件夹下创建资源文件attrs.xml或则自定义一个资源文件xx.xml,都可以。

之后在里面配置declare-styleable ,name为PersonAttr

我这里设置了姓名name,性别sex,年龄age,以及特征属性weight(fat,mid,thin内部的3个属性及对应的属性值),还有是否成年adult,和TextView的字体大小textView。

可能这里有人会问,format是什么,里面的单词代表的又是什么意思。

format就是格式,里面的就是这个属性对应的格式,下面列出来大致的格式有:

1. reference:参考某一资源ID,以此类推

(1)属性定义:

(2)属性使用:

android:layout_width = "42dip"

android:layout_height = "42dip"

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

/>

2. color:颜色值

3. boolean:布尔值

4. dimension:尺寸值。注意,这里如果是dp那就会做像素转换

5. float:浮点值。

6. integer:整型值。

7. string:字符串

8. fraction:百分数。

9. enum:枚举值

10. flag:是自己定义的,类似于 android:gravity="top",就是里面对应了自己的属性值。

11. reference|color:颜色的资源文件。12.reference|boolean:布尔值的资源文件

注意://由于reference是从资源文件中获取:所以在XML文件中写这个属性的时候必须personattr:name="@string/app_name"这种格式,否则会出错

2.设置好属性文件后,在使用的布局中写相关配置:

xmlns:personattr="http://schemas.android.com/apk/res/com.example.declare_styleable"

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:layout_width="wrap_content"

android:layout_height="wrap_content"

personattr:name="@string/person_name"

personattr:weight ="fat"

personattr:adult ="false"

personattr:textSize="@dimen/text_size"/>

这里要先应用这个attr:

xmlns:personattr="http://schemas.android.com/apk/res/com.example.declare_styleable"

对应结构是:

xmlns:你自己定义的名称="http://schemas.android.com/apk/res/你程序的package包名"    (我这是com.example.declare_styleable)

包名是配置文件中   package="com.example.declare_styleable" 这样格式的

之后在布局中自定义的类中设相关属性:

你自己定义的名称:你设的属性 ="属性值";

3.最后在自定义控件的构造方法中获取你配置的属性值:

public class PersonView extends TextView {

public PersonView(Context context) {

super(context);

// TODO Auto-generated constructor stub

}

public PersonView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

// TODO Auto-generated constructor stub

}

public PersonView(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

TypedArray tArray = context.obtainStyledAttributes(attrs,R.styleable.PersonAttr);//获取配置属性

String name = tArray.getString(R.styleable.PersonAttr_name);//得到属性name

int age = tArray.getInt(R.styleable.PersonAttr_age, 15);

Boolean adult = tArray.getBoolean(R.styleable.PersonAttr_adult, false);

String str_adult = getAdultStatus(adult);

int weight = tArray.getInt(R.styleable.PersonAttr_weight, 1);// 默认是中等身材,属性为:1

String str_weight = getWeightStatus(weight);//获得肥胖属性

float textSize = tArray.getDimension(R.styleable.PersonAttr_textSize,R.dimen.default_text_size);// 如果你设置为DP等单位,会做像素转换

tArray.recycle();//回收资源

//      setTextSize(textSize);//设置字体大小

setText("姓名:" + name + "\n" + "年龄:" + age + "\n" + "是否成年:" + str_adult

+ "\n" + "体形:" + str_weight);//给自定义的控件赋值

}

/** 根据传入的值判断是否成年 */

public String getAdultStatus(Boolean adult ){

String str_adult = "未成年";

if (adult) {

str_adult = "成年";

}

return str_adult;

}

/** 根据传入的值判断肥胖状态 */

public String getWeightStatus(int weight){

String str_weight = "中等";

switch (weight) {

case 0:

str_weight = "瘦";

break;

case 1:

str_weight = "中等";

break;

case 2:

str_weight = "肥胖";

break;

default:

break;

}

return str_weight;

}

}运行后就是:

68c1e6060e29b24f150d25d9bd216dcd.png

这样,以后我们就可以根据这个方法,去自定义控件并自定义配置属性了,大大提高了自定义布局的使用效率。

对应的源码下载地址:下载地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值