本文参考:http://blog.csdn.net/u013205623/article/details/53580426
一、自定义控件属性
自定义控件属性使用:
1,在values目录下新建atttrs.xml文件;【文件较多时,可实现分包新建 attrs_register.xml】
2,声明属性详情;
3,自定义控件构造方法中获取属性,并在实际构建View时使用。
示例:
新建attrs.xml文件,声明属性详情:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="SelfDefineTextView"> //属于指定控件名的属性
<attr name="name" format="string" />
<attr name="attr" format="enum">
<enum name="desc" value="0" />
<enum name="detail" value="1" />
</attr>
<attr name="work" format="boolean" />
<attr name="color1" format="reference|color" />
<attr name="state">
<flag name="young" value="18" />
<flag name="adult" value="28" />
<flag name="old" value="60" />
</attr>
<attr name="size" format="dimension" />
<!--分数-->
<attr name="fraction" format="fraction" />
<attr name="other" format="float" />
</declare-styleable>
</resources>
获取属性并使用:
public SelfDefineTextView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SelfDefineTextView);
String attr = typedArray.getString(R.styleable.SelfDefineTextView_attr);
String name = typedArray.getString(R.styleable.SelfDefineTextView_name);
int color = typedArray.getColor(R.styleable.SelfDefineTextView_color1, 0xFF45C01A);
float fraction = typedArray.getFraction(R.styleable.SelfDefineTextView_fraction, 1, 1, 0.5f);
float other = typedArray.getFloat(R.styleable.SelfDefineTextView_other, 0f);
float size = typedArray.getDimension(R.styleable.SelfDefineTextView_size, 20f);
String state = typedArray.getString(R.styleable.SelfDefineTextView_state);
int state = typedArray.getInt(R.styleable.SelfDefineTextView_state, -1);
boolean work = typedArray.getBoolean(R.styleable.SelfDefineTextView_work, false);
typedArray.recycle();
this.setTextSize(size);
this.setTextColor(color);
this.setText(
"attr:" + attr + "\n" +
"name:" + name + "\n" +
"fraction:" + fraction + "\n" +
"other:" + other + "\n" +
"state:" + state + "\n" +
"work:" + work
);
}
属性获取第二种方式:
/*第二种方式:*/
TypedArray typedArray1 = context.obtainStyledAttributes(attrs, R.styleable.SelfDefineTextView);
int n = typedArray1.getIndexCount();
for (int i = 0; i < n; i++) {
int attrStr = typedArray1.getIndex(i);
switch (attrStr) {
case R.styleable.SelfDefineTextView_name:
String nameStr = typedArray1.getString(attrStr);
break;
}
}
使用时:
<com.future.selfdefineview.view.SelfDefineTextView
android:id="@+id/self_define_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
attrtest:attr="desc"
attrtest:color1="#f91245ff"
attrtest:fraction="10%"
attrtest:name="自定义TextView"
attrtest:other="96.88"
attrtest:size="@dimen/text_size"
attrtest:state="adult"
attrtest:work="true">
细节注意点:
1,属性声明文件中该自定义控件的名字与自定义控件名相同;【可不一样,不建议】
最重要的一点是declare-styleable旁边有一个name属性,这个name的取值就是对应所定义的类名。即要为哪个类添加自定义的属性,那这个name属性的值就是哪个
————————–SelfDefineTextView【自定义控件名/属性命名】
2,属性获取时,参数变量是属性命名_详细属性 得方式;
————————–String attr = typedArray.getString(R.styleable.SelfDefineTextView_attr);
3,TypeArray对象使用完时,一定释放:
————————–typedArray.recycle();
4,属性集导入方式:
xmlns:attrstest=”http://schemas.android.com/apk/res-auto”
二、属性详解
属性取值类型有:
● reference:引用资源
● string:字符串
● Color:颜色
● boolean:布尔值
● dimension:尺寸值
● float:浮点型
● integer:整型
● fraction:百分数
● enum:枚举类型
● flag:位或运算
- reference指的是从string.xml、drawable.xml、color.xml等引用过来的值
- flag是自己定义的,类似于 android:gravity=”top”
- dimension 指的是是从dimension.xml里引用过来的内容.注意,这里如果是dp那就会做像素转换
1,TypeArray获取属性值:
typedArray.getInt(int index, float defValue);
typedArray.getDimension(int index, float defValue);
typedArray.getBoolean(int index, float defValue);
typedArray.getColor(int index, float defValue);
typedArray.getString(int index)
typedArray.getDrawable(int index);
typedArray.getResources();
2,具体详情
(1)refrerence:参考某一资源ID【Drawable】
<declare-styleable name = "名称">
<attr name = "background" format = "reference" />
</declare-styleable>
<ImageView
android:layout_width = "86dip"
android:layout_height = "86dip"
android:background = "@drawable/图片ID"/>
(2)color:颜色值
<declare-styleable name = "名称">
<attr name = "textColor" format = "color" />
</declare-styleable>
<TextView
android:layout_width = "32dip"
android:layout_height = "32dip"
android:textColor = "#FF0000"/>
(3)boolean:布尔值,正确或者错误
<declare-styleable name = "名称">
<attr name = "focusable" format = "boolean" />
</declare-styleable>
<Button
android:layout_width = "40dip"
android:layout_height = "40dip"
android:focusable = "true"/>
(4)dimension:尺寸值【43dp/sp/px】
<declare-styleable name = "名称">
<attr name = "layout_width" format = "dimension" />
</declare-styleable>
<Button
android:layout_width = "66dip"
android:layout_height = "88dip"/>
(5)float:小数值
<declare-styleable name = "AlphaAnimation">
<attr name = "fromAlpha" format = "float" />
<attr name = "toAlpha" format = "float" />
</declare-styleable>
<alpha
android:fromAlpha = "1.0"
android:toAlpha = "0.7"/>
(6)Integer:整数值
<declare-styleable name = "AnimatedRotateDrawable">
<attr name = "visible" />
<attr name = "frameDuration" format="integer" />
<attr name = "framesCount" format="integer" />
<attr name = "pivotX" />
<attr name = "pivotY" />
<attr name = "drawable" />
</declare-styleable>
<animated-rotate
xmlns:android = "http://schemas.android.com/apk/res/android"
android:drawable = "@drawable/图片ID"
android:pivotX = "50%"
android:pivotY = "50%"
android:framesCount = "12"
android:frameDuration = "100"/>
(7)string:字符串
<declare-styleable name = "SelfDefineTextView">
<attr name = "apiKey" format = "string" />
</declare-styleable>
<com.future.view.SelfDefineTextView
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:apiKey = "jahkjgkanbvkjKNvlNLBnLnl" />
(8)fraction:百分数
<declare-styleable name="RotateDrawable">
<attr name = "visible" />
<attr name = "fromDegrees" format = "float" />
<attr name = "toDegrees" format = "float" />
<attr name = "pivotX" format = "fraction" />
<attr name = "pivotY" format = "fraction" />
<attr name = "drawable" />
</declare-styleable>
<rotate
xmlns:android = "http://schemas.android.com/apk/res/android"
android:interpolator = "@anim/动画ID"
android:fromDegrees = "0"
android:toDegrees = "360"
android:pivotX = "200%"
android:pivotY = "300%"
android:duration = "5000"
android:repeatMode = "restart"
android:repeatCount = "infinite"/>
(9)menu:枚举
<declare-styleable name="名称">
<attr name="orientation">
<enum name="horizontal" value="0" />
<enum name="vertical" value="1" />
</attr>
</declare-styleable>
<LinearLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
android:orientation = "vertical"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent">
</LinearLayout>
(10)flag:位或运算
【类似menu】
<attr name="state">
<flag name="young" value="18" />
<flag name="adult" value="28" />
<flag name="old" value="60" />
</attr>
attrtest:state="adult"
【类似或运算:表示或者或者】
<declare-styleable name="名称">
<attr name="windowSoftInputMode">
<flag name = "stateUnspecified" value = "0" />
<flag name = "stateUnchanged" value = "1" />
<flag name = "stateHidden" value = "2" />
<flag name = "stateAlwaysHidden" value = "3" />
<flag name = "stateVisible" value = "4" />
<flag name = "stateAlwaysVisible" value = "5" />
<flag name = "adjustUnspecified" value = "0x00" />
<flag name = "adjustResize" value = "0x10" />
<flag name = "adjustPan" value = "0x20" />
<flag name = "adjustNothing" value = "0x30" />
</attr>
</declare-styleable>
<activity
android:name = ".StyleAndThemeActivity"
android:label = "@string/app_name"
android:windowSoftInputMode = "stateUnspecified | stateUnchanged | stateHidden">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>