Android自定义属性的使用

本文详细介绍了如何在Android中通过创建attrs.xml文件来定义自定义属性,实现对控件功能的扩展。通过实例展示了如何在布局文件中使用这些自定义属性,并在代码中获取它们的值。同时,提供了从定义到使用的完整流程,包括属性的枚举、位或运算等高级用法,以及如何在实际项目中灵活应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、属性的解释

二、自定义属性的使用



一、属性的解释

android values中attrs.xml属性类型对应的解释:

1. reference:参考某一资源ID。
    (1)属性定义:
            

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <declare-styleable name = "名称">  
  2.                    <attr name = "background" format = "reference" />  
  3. </declare-styleable>  

    (2)属性使用:
            
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <ImageView  
  2.                      android:layout_width = "42dip"  
  3.                      android:layout_height = "42dip"  
  4.                      android:background = "@drawable/图片ID"  
  5.                      />  


2. color:颜色值。
    (1)属性定义:
            

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <declare-styleable name = "名称">  
  2.                    <attr name = "textColor" format = "color" />  
  3.             </declare-styleable>  

    (2)属性使用:
           
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <TextView  
  2.                     android:layout_width = "42dip"  
  3.                     android:layout_height = "42dip"  
  4.                     android:textColor = "#00FF00"  
  5.                     />  

 3. boolean:布尔值。
    (1)属性定义:
            
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <declare-styleable name = "名称">  
  2.                 <attr name = "focusable" format = "boolean" />  
  3. </declare-styleable>  

    (2)属性使用:
            
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <Button  
  2.                    android:layout_width = "42dip"  
  3.                    android:layout_height = "42dip"  
  4.                    android:focusable = "true"/>  

4. dimension:尺寸值。
     (1)属性定义:
             
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <declare-styleable name = "名称">  
  2.                    <attr name = "layout_width" format = "dimension" />  
  3. </declare-styleable>  

    (2)属性使用:
            
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <Button  
  2.                    android:layout_width = "42dip"  
  3.                    android:layout_height = "42dip"  
  4.                   />  

 5. float:浮点值。
    (1)属性定义:
            
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <declare-styleable name = "AlphaAnimation">  
  2.                    <attr name = "fromAlpha" format = "float" />  
  3.                    <attr name = "toAlpha" format = "float" />  
  4. </declare-styleable>  

    (2)属性使用:
            
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <alpha  
  2.        android:fromAlpha = "1.0"  
  3.        android:toAlpha = "0.7"  
  4. />  
 
6. integer:整型值。
    (1)属性定义:
            
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <declare-styleable name = "AnimatedRotateDrawable">  
  2.                    <attr name = "visible" />  
  3.                    <attr name = "frameDuration" format="integer" />  
  4.                    <attr name = "framesCount" format="integer" />  
  5.                    <attr name = "pivotX" />  
  6.                    <attr name = "pivotY" />  
  7.                    <attr name = "drawable" />  
  8. </declare-styleable>  

    (2)属性使用:
            
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <animated-rotate  
  2.                    xmlns:android = "http://schemas.android.com/apk/res/android"    
  3.                    android:drawable = "@drawable/图片ID"    
  4.                    android:pivotX = "50%"    
  5.                    android:pivotY = "50%"    
  6.                    android:framesCount = "12"    
  7.                    android:frameDuration = "100"  
  8.                    />  
 
7. string:字符串。
    (1)属性定义:
            
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <declare-styleable name = "MapView">  
  2.                    <attr name = "apiKey" format = "string" />  
  3. </declare-styleable>  

    (2)属性使用:
            
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <com.google.android.maps.MapView  
  2.                     android:layout_width = "fill_parent"  
  3.                     android:layout_height = "fill_parent"  
  4.                     android:apiKey = "0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g"  
  5.                     />  

8. fraction:百分数。
     (1)属性定义:
            
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <declare-styleable name="RotateDrawable">  
  2.                    <attr name = "visible" />  
  3.                    <attr name = "fromDegrees" format = "float" />  
  4.                    <attr name = "toDegrees" format = "float" />  
  5.                    <attr name = "pivotX" format = "fraction" />  
  6.                    <attr name = "pivotY" format = "fraction" />  
  7.                    <attr name = "drawable" />  
  8. </declare-styleable>  

    (2)属性使用:
            
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <rotate  
  2.                  xmlns:android = "http://schemas.android.com/apk/res/android"   
  3.                android:interpolator = "@anim/动画ID"  
  4.                  android:fromDegrees = "0"   
  5.                android:toDegrees = "360"  
  6.                  android:pivotX = "200%"  
  7.                  android:pivotY = "300%"   
  8.                android:duration = "5000"  
  9.                  android:repeatMode = "restart"  
  10.                  android:repeatCount = "infinite"  
  11.                 />  

9. enum:枚举值。
    (1)属性定义:
            
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <declare-styleable name="名称">  
  2.                    <attr name="orientation">  
  3.                           <enum name="horizontal" value="0" />  
  4.                           <enum name="vertical" value="1" />  
  5.                    </attr>              
  6. </declare-styleable>  

    (2)属性使用:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <LinearLayout  
  2.                     xmlns:android = "http://schemas.android.com/apk/res/android"  
  3.                     android:orientation = "vertical"  
  4.                     android:layout_width = "fill_parent"  
  5.                     android:layout_height = "fill_parent"  
  6.                     >  
  7. </LinearLayout>  

10. flag:位或运算。
     (1)属性定义:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <declare-styleable name="名称">  
  2.                    <attr name="windowSoftInputMode">  
  3.                            <flag name = "stateUnspecified" value = "0" />  
  4.                            <flag name = "stateUnchanged" value = "1" />  
  5.                            <flag name = "stateHidden" value = "2" />  
  6.                            <flag name = "stateAlwaysHidden" value = "3" />  
  7.                            <flag name = "stateVisible" value = "4" />  
  8.                            <flag name = "stateAlwaysVisible" value = "5" />  
  9.                            <flag name = "adjustUnspecified" value = "0x00" />  
  10.                            <flag name = "adjustResize" value = "0x10" />  
  11.                            <flag name = "adjustPan" value = "0x20" />  
  12.                            <flag name = "adjustNothing" value = "0x30" />  
  13.                     </attr>           
  14. lt;/declare-styleable>  

     (2)属性使用:
            
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <activity  
  2.       android:name = ".StyleAndThemeActivity"  
  3.       android:label = "@string/app_name"  
  4.       android:windowSoftInputMode = "stateUnspecified | stateUnchanged | stateHidden">  
  5.       <intent-filter>  
  6.             <action android:name = "android.intent.action.MAIN" />  
  7.             <category android:name = "android.intent.category.LAUNCHER" />  
  8.       </intent-filter>  
  9. </activity>  


     注意:
     属性定义时可以指定多种类型值。
    (1)属性定义:
            
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <declare-styleable name = "名称">  
  2.       <attr name = "background" format = "reference|color" />  
  3. </declare-styleable>  

    (2)属性使用:
             
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <ImageView  
  2.         android:layout_width = "42dip"  
  3.         android:layout_height = "42dip"  
  4.         android:background = "@drawable/图片ID|#00FF00"  
  5.         />  



二、自定义属性的使用


在android中我们习惯了在XML布局文件中,进行控件属性的设置,由于控件默认提供的属性数量有限,为了增加属性我们可以给控件添加一些自定义的属性,下面来讲一下为控件添加自定义属性的几个步骤。

1>在res/values文件下添加一个attrs.xml文件(没有的话)如下:

 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources> 
  3.     <!--添加了一个ImageTextButton的属性集  --> 
  4.     <declare-styleable name="ImageTextButton"> 
  5.         <attr format="reference" name="iconImage" /> 
  6.         <attr format="reference" name="bkImage" /> 
  7.         <attr format="integer" name="borderLeft" /> 
  8.         <attr format="integer" name="borderRight" /> 
  9.         <attr format="integer" name="borderTop" /> 
  10.         <attr format="integer" name="borderBottom" /> 
  11.         <attr format="integer" name="buttonstate" /> 
  12.         <attr name="iconLocation"> 
  13.             <enum name="center" value="0" /> 
  14.             <enum name="left" value="1" /> 
  15.             <enum name="right" value="2" /> 
  16.         </attr> 
  17.     </declare-styleable> 
  18. </resources> 

2>在相关的XML布局文件中使用自定义的属性:

 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:mux="http://schemas.android.com/apk/res/com.shareboard"  
  4.     android:layout_width="530dp"  
  5.     android:layout_height="320dp"  
  6.     android:background="@color/dlgBg"  
  7.     android:orientation="vertical" >  
  8. <!--com.shareboard 为工程所在包  --> 
  9.             <com.shareboard.uicontrols.ImageTextButton  
  10.                 android:id="@+id/btnCancel"  
  11.                 android:layout_width="100sp"  
  12.                 android:layout_height="wrap_content"  
  13.                 android:layout_alignParentRight="true"  
  14.                 android:layout_marginRight="20dp"  
  15.                 mux:bkImage="@drawable/cell_bkgnd"  
  16.                 mux:buttonstate="2"  
  17.                 android:text="@string/btn_cancel"  
  18.                 android:textColor="@color/btnText"  
  19.                 android:textSize="@dimen/btnText" />  
  20.   
  21.           <com.shareboard.uicontrols.ImageTextButton  
  22.                 android:id="@+id/btnDone"  
  23.                 android:layout_width="100sp"  
  24.                 android:layout_height="wrap_content"  
  25.                 android:layout_alignParentLeft="true"  
  26.                 android:layout_marginLeft="@dimen/btnMargin"  
  27.                 mux:bkImage="@drawable/cell_bkgnd"  
  28.                 mux:buttonstate="2"  
  29.                 android:text="@string/btn_done"  
  30.                 android:textColor="@color/btnText"  
  31.                 android:textSize="@dimen/btnText" />  
  32. </LinearLayout>  

3>在代码中获取自定义的属性值: 

 
  1. public final class ImageTextButton extends Button { 
  2.     private int mIconId; 
  3.     private int mBkimgId; 
  4.     private int mBorderLeft = 10
  5.     private int mBorderRight = 10
  6.     private int mBorderTop = 10
  7.     private int mBorderBottom = 10
  8.     private int mnButtonState = 4
  9.     private int mIconLocation = 0
  10.     private boolean mbChecked = false
  11.  
  12.     public ImageTextButton(Context context) { 
  13.         super(context); 
  14.         setClickable(true); 
  15.     } 
  16.  
  17.     public ImageTextButton(Context context, AttributeSet attrs) { 
  18.         super(context, attrs); 
  19.         readAttrs(context, attrs); 
  20.         setClickable(true); 
  21.     } 
  22.  
  23.     private void readAttrs(Context context, AttributeSet attrs) { 
  24.         TypedArray types = context.obtainStyledAttributes(attrs, 
  25.                 R.styleable.ImageTextButton); 
  26.         final int count = types.getIndexCount(); 
  27.         for (int i = 0; i < count; ++i) { 
  28.             int attr = types.getIndex(i); 
  29.             switch (attr) { 
  30.             case R.styleable.ImageTextButton_iconImage: 
  31.                 mIconId = types.getResourceId(attr, 0); 
  32.                 break
  33.             case R.styleable.ImageTextButton_bkImage: 
  34.                 mBkimgId = types.getResourceId(attr, 0); 
  35.                 break
  36.             case R.styleable.ImageTextButton_borderLeft: 
  37.                 mBorderLeft = types.getInteger(attr, 10); 
  38.                 break
  39.             case R.styleable.ImageTextButton_borderRight: 
  40.                 mBorderRight = types.getInteger(attr, 10); 
  41.                 break
  42.             case R.styleable.ImageTextButton_borderTop: 
  43.                 mBorderTop = types.getInteger(attr, 10); 
  44.                 break
  45.             case R.styleable.ImageTextButton_borderBottom: 
  46.                 mBorderBottom = types.getInteger(attr, 10); 
  47.                 break
  48.             case R.styleable.ImageTextButton_iconLocation: 
  49.                 mIconLocation = types.getInteger(attr, 0); 
  50.                 break
  51.             case R.styleable.ImageTextButton_buttonstate: 
  52.                 mnButtonState = types.getInteger(attr, 4); 
  53.                 break
  54.             } 
  55.         } 
  56.         types.recycle(); 
  57.     } 

好了这就完成了自定义属性的定义和使用。


原文引用整理。

http://blog.youkuaiyun.com/jiangwei0910410003/article/details/17006087

http://blog.youkuaiyun.com/wangjia55/article/details/9027629






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值