Android 自定义控件的属性使用

来源:互联网 发布:淘宝店铺id怎么查 编辑:程序博客网 时间:2024/06/06 06:58

一 性 介绍与应用

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

自定义属性都存在于/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文件里面的内容来决定的。


来源: <http://www.jb51.net/article/48962.htm>

二、自定义属性的应用

让我们再来看看布局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

[html] view plain copy
  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.         int set_icon = attrs.getAttributeResourceValue(ATTRS, "set_icon", 0);  
  13.         //设置内容  
  14.         String set_content = attrs.getAttributeValue(ATTRS, "set_content");  
  15.         //设置更新内容  
  16.         String set_update = attrs.getAttributeValue(ATTRS, "set_update");  
  17.         //设置箭头  
  18.         int 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>  
[html] view plain copy
  1. <span style="color:#333333;">使用:</span>  
[html] view plain copy
  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来实现的

[html] view plain copy
  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.         TypedArray 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>  

属性文件

[html] view plain copy
  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>  

使用

[html] view plain copy
  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>  
[html] view plain copy
  1.   

源码地址:http://download.csdn.net/detail/mr_kings/9094921


0 0
原创粉丝点击