Android 自定义控件的属性使用

阅读 126

2023-03-28


一 性 介绍与应用

最近项目中经常需要用到自定义控件,因此自定义属性也是经常要用到的,在此说明一下自定义属性的用法:

自定义属性都存在于/value/attr.xml文件中,以如下格式存在。


复制代码代码如下:


<resource> 
  
 <declare-styleable name="自定义属性名称">
 <attr name="属性名称" format="属性种类"/>
 ......
 </declare-styleable>
 </resource>

对于自定义属性中的format的值及其含义如下:

format属性值:reference 、color、boolean、dimension、float、integer、string、fraction、enum、flag

1. reference:参考某一资源ID。

(1)属性定义:


复制代码代码如下:

<declare-styleable name = "名称"> 
  
 <attr name = "background" format = "reference" />
 </declare-styleable>


(2)属性使用:


复制代码代码如下:


<ImageView 
  
 android:layout_width="42dip"
 android:layout_height="42dip"
 android:background="@drawable/图片ID"
 />


2.color:颜色值。

(1)属性定义:


复制代码代码如下:

<declare-styleablename="名称"> 
  
 <attrname="textColor"format="color"/>
 </declare-styleable>

(2)属性使用:


复制代码代码如下:

<TextView
 
 android:layout_width="42dip"
 
 android:layout_height="42dip"
 
 android:textColor="#00FF00"
 
 />


3.boolean:布尔值。

(1)属性定义:


复制代码代码如下:

<declare-styleablename="名称"> 
  
 <attrname="focusable"format="boolean"/>
 </declare-styleable>


(2)属性使用:


复制代码代码如下:


<Button
 
 android:layout_width="42dip"
 
 android:layout_height="42dip"
 
 android:focusable="true"
 
 />


4.dimension:尺寸值。

(1)属性定义:


复制代码代码如下:


<declare-styleablename="名称"> 
  
 <attrname="layout_width"format="dimension"/>
 </declare-styleable>


(2)属性使用:

复制代码代码如下:

<Button
 
 android:layout_width="42dip"
 
 android:layout_height="42dip"
 
 />


5.float:浮点值。

(1)属性定义:


复制代码代码如下:

<declare-styleablename="AlphaAnimation">
 
 <attrname="fromAlpha"format="float"/>
 
 <attrname="toAlpha"format="float"/>
 
 </declare-styleable>


(2)属性使用:


复制代码代码如下:


<alpha
 
 android:fromAlpha="1.0"
 
 android:toAlpha="0.7"
 
 />


6.integer:整型值。

(1)属性定义:


复制代码代码如下:


<declare-styleablename="AnimatedRotateDrawable">
 
 <attrname="visible"/>
 
 <attrname="frameDuration"format="integer"/>
 
 <attrname="framesCount"format="integer"/>
 
 <attrname="pivotX"/>
 
 <attrname="pivotY"/>
 
 <attrname="drawable"/>
 
 </declare-styleable>

(2)属性使用:


复制代码代码如下:


<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:字符串。

(1)属性定义:

复制代码代码如下:

<declare-styleablename="MapView">
 
 <attrname="apiKey"format="string"/>
 
 </declare-styleable>


(2)属性使用:


复制代码代码如下:

<com.google.android.maps.MapView
 
 android:layout_width="fill_parent"
 
 android:layout_height="fill_parent"
 
 android:apiKey="0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g"
 
 />

8.fraction:百分数。

(1)属性定义:


复制代码代码如下:


<declare-styleablename="RotateDrawable">
 
 <attrname="visible"/>
 
 <attrname="fromDegrees"format="float"/>
 
 <attrname="toDegrees"format="float"/>
 
 <attrname="pivotX"format="fraction"/>
 
 <attrname="pivotY"format="fraction"/>
 
 <attrname="drawable"/>
 
 </declare-styleable>


(2)属性使用:


复制代码代码如下:


<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.enum:枚举值。

(1)属性定义:


复制代码代码如下:

<declare-styleablename="名称">
 
 <attrname="orientation">
 
 <enumname="horizontal"value="0"/>
 
 <enumname="vertical"value="1"/>
 
 </attr>
 
 </declare-styleable>


(2)属性使用:


复制代码代码如下:

<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:位或运算。

(1)属性定义:


复制代码代码如下:


<declare-styleablename="名称">
 
 <attrname="windowSoftInputMode">
 
 <flagname="stateUnspecified"value="0"/>
 
 <flagname="stateUnchanged"value="1"/>
 
 <flagname="stateHidden"value="2"/>
 
 <flagname="stateAlwaysHidden"value="3"/>
 
 <flagname="stateVisible"value="4"/>
 
 <flagname="stateAlwaysVisible"value="5"/>
 
 <flagname="adjustUnspecified"value="0x00"/>
 
 <flagname="adjustResize"value="0x10"/>
 
 <flagname="adjustPan"value="0x20"/>
 
 <flagname="adjustNothing"value="0x30"/>
 
 </attr>
 
 </declare-styleable>


(2)属性使用:


复制代码代码如下:

<activity
 
 android:name=".StyleAndThemeActivity"
 
 android:label="@string/app_name"
 
 android:windowSoftInputMode="stateUnspecified|stateUnchanged | stateHidden">
 
 <intent-filter>
 
 <actionandroid:name="android.intent.action.MAIN"/>
 
 <categoryandroid:name="android.intent.category.LAUNCHER"/>
 
 </intent-filter>
 
 </activity>


特别要注意:

属性定义时可以指定多种类型值。

(1)属性定义:


复制代码代码如下:

<declare-styleablename="名称">
 
 <attrname="background"format="reference|color"/>
 
 </declare-styleable>


(2)属性使用:


复制代码代码如下:


<ImageView
 
 android:layout_width="42dip"
 
 android:layout_height="42dip"
 
 android:background="@drawable/图片ID|#00FF00"
 
 />


下面说说AttributeSet与TypedArray在自定义控件中的作用:

AttributeSet的作用就是在控件进行初始化的时候,解析布局文件中该控件的属性(keyeg:background)与该值(valueeg:@drawable/icon)的信息封装在AttributeSet中,传递给该控件(View)的构造函数。对于非Android自带的属性,在View类中处理时是无法识别的,因此需要我们自己解析。所以这就要用到另外一个类TypedArray。在AttributeSet中我们有属性名称,有属性值,但是控件如何知道哪个属性代表什么意思呢?这个工作就由TypedArray来做了。TypedArray对象封装了/values/attrs.xml中的styleable里定义的每个属性的类型信息,通过TypedArray我们就可以知道AttributeSet中封装的值到底是干什么的了,从而可以对这些数据进行应用。

AttributeSet就相当于一盒糖,TypedArray就相当于这盒糖上的标签说明,告诉用户每个糖的口味等。这盒糖有什么口味是由用户自己的styleable文件里面的内容来决定的。





二、自定义属性的应用


让我们再来看看布局xml中需要注意的事项。

首先得声明一下:xmlns:mytool(名字可以任意)=http://schemas.android.com/apk/res/cn.zzm.toolbar (自定义包名)
注意,“mytool”可以换成其他的任何名字,后面的url地址必须最后一部分必须用上自定义组件的包名。自定义属性了,在属性名前加上“mytool”即可。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:CommonText="http://schemas.android.com/apk/res-auto" //对与自定义属性的引用可以直接使用这个
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@drawable/bg"
     android:orientation="vertical" >

使用自定义的时候,有两种方式 AttributeSet 来获取属性或者 TypedArray




1. <span style="color: rgb(51, 51, 51);">   </span><span style="color:#ff0000;"> private static final String ATTRS = "http://schemas.android.com/apk/res-auto";</span><span style="color:#333333;">  
2.     private TextView tv_setting_update;  
3.   
4.     public SetItemView(Context context) {  
5.         super(context);  
6.   
7.     }  
8.     public SetItemView(Context context, AttributeSet attrs) {  
9.         super(context, attrs);  
10.          init();  
11.         //设置图标  
12. set_icon = attrs.getAttributeResourceValue(ATTRS, "set_icon", 0);  
13.         //设置内容  
14. set_content = attrs.getAttributeValue(ATTRS, "set_content");  
15.         //设置更新内容  
16. set_update = attrs.getAttributeValue(ATTRS, "set_update");  
17.         //设置箭头  
18. arrow = attrs.getAttributeResourceValue(ATTRS, "set_arrow", 0);  
19.         if (set_icon != 0) {  
20.             setIv_icon(set_icon);  
21.         }  
22.         if (arrow != 0) {  
23.             setIv_arrow(arrow);  
24.         }  
25.         if (!TextUtils.isEmpty(set_update)) {  
26.             tv_setting_update.setVisibility(View.VISIBLE);  
27.             setTv_setting_update(set_update,false);  
28.   
29.         }  
30.         if (!TextUtils.isEmpty(set_content)) {  
31.             setTv_content(set_content);  
32.         }  
33.     }  
34. public void setIv_icon(int iv_icon) {  
35.         this.iv_setting_icon.setBackgroundResource(iv_icon);  
36.     }  
37.   
38.     public void setTv_content(String tv_content) {  
39.         this.tv_setting_content.setText(tv_content);  
40.     }  
41. ...</span>


1. <span style="color:#333333;">使用:</span>



1. <span style="color:#333333;"><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
2. </span><span style="color:#ff0000;">  xmlns:itemView="http://schemas.android.com/apk/res-auto"</span><span style="color:#333333;">  
3. android:layout_width="match_parent"  
4. android:layout_height="match_parent"  
5. android:background="@drawable/bg_setting"  
6. android:orientation="vertical">  
7.   
8. <com.xxx.widget.SetItemView  
9. android:id="@+id/setItem_mapManger"  
10. android:layout_width="fill_parent"  
11. android:layout_height="wrap_content"  
12. </span><span style="color:#ff0000;">  itemView:set_arrow="@drawable/img_arrow"  
13. itemView:set_content="商城地图管理"  
14. itemView:set_icon="@drawable/icon_setting_0" /></span>


TypedArray来实现的



1. <span style="color:#333333;">/**  
2.  * 属性 参数的配置 自己 到attrs 文件去配置  
3.  * 如果 不需要 就不要 get set 自己选择性的 重写  
4.  */  
5. public class MyTextView extends LinearLayout{  
6.    private String mTextInfo;  
7.     private int mTextColor;  
8.     private  float mTextSize;  
9.     private TextView tv_info;  
10.     
11.   
12.     private TextView tv_num;  
13.     private String mTextNum;  
14.     public MyTextView(Context context) {  
15.         super(context);  
16.         init();  
17.     }  
18.   
19.     public MyTextView(Context context, AttributeSet attrs) {  
20.         super(context, attrs);  
21. a = context.obtainStyledAttributes(attrs, R.styleable.CommonText);  
22.         //属性名CommonText 后面加上参数 _(参数名)  
23. mTextNum = a.getString(R.styleable.CommonText_textNum);   
24. mTextInfo = a.getString(R.styleable.CommonText_textInfo);  
25. mTextColor = a.getColor(R.styleable.CommonText_textColor, 0XFFFFFFFF);  
26. mTextSize = a.getDimensionPixelSize(R.styleable.CommonText_textSize, 0);  
27.         init();  
28.         a.recycle();  
29.     }  
30.   
31.     
32.     private void init() {  
33. </span><span style="color:#ff0000;">   View.inflate(getContext(), R.layout.my_text_view, this);</span><span style="color:#333333;">  
34. tv_info = (TextView) findViewById(R.id.tv_info);  
35. tv_num = (TextView) findViewById(R.id.tv_num);  
36.         if (mTextInfo!=null) {  
37.              setTv_info(mTextInfo);  
38.         }  
39.         if (mTextNum!=null) {  
40.             setTv_num(mTextNum);  
41.         }  
42.         if (mTextColor!=0) {  
43.             tv_info.setTextColor(Color.WHITE);  
44.             tv_num.setTextColor(Color.WHITE);  
45.         }  
46.         
47.     }  
48.     public TextView getTv_info() {  
49.         return tv_info;  
50.     }  
51.   
52.     public void setTv_info(String tv_info) {  
53.         this.tv_info.setText(tv_info);  
54.     }  
55.   
56.     public TextView getTv_num() {  
57.         return tv_num;  
58.     }  
59.   
60.     public void setTv_num(String tv_num) {  
61.         this.tv_num.setText(tv_num);  
62.     }  
63.   
64. }</span>


属性文件




1. <?xml version="1.0" encoding="utf-8"?>  
2. <resources>  
3. <declare-styleable name="CommonText">  
4. <attr name="textNum" format="string"></attr>  
5. <attr name="textInfo" format="string"></attr>  
6. <attr name="textColor" format="color"></attr>  
7. <attr name="textSize" format="dimension"></attr>  
8. </declare-styleable>  
9. </resources>



使用


1. <com.xx.userstateinfo.MyTextView  
2. android:layout_width="wrap_content"  
3. android:layout_height="wrap_content"  
4. CommonText:textInfo="关注"  
5. CommonText:textNum="100" >  
6. </com.xx.userstateinfo.MyTextView>



精彩评论(0)

0 0 举报