Android 自定义控件属性

有了自定义控件才有自定义属性

在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.           format:属性值是个什么类型的      name:属性名字
  6.         <attr format="reference" name="iconImage" /> localization="suggested":这个是做国际化
  7.         <attr format="reference" name="bkImage" /> 
  8.         <attr format="integer" name="borderLeft" /> 
  9.         <attr format="integer" name="borderRight" /> 
  10.         <attr format="integer" name="borderTop" /> 
  11.         <attr format="integer" name="borderBottom" /> 
  12.         <attr format="integer" name="buttonstate" /> 
  13.         <attr name="iconLocation"> 
  14.             <enum name="center" value="0" /> 
  15.             <enum name="left" value="1" /> 
  16.             <enum name="right" value="2" /> 
  17.         </attr> 
  18.     </declare-styleable> 
  19. </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.     } 

两种设置属性值的方式(自已总结)

// 获取属性, 并给里面的TextView设置值

        // String title = attrs.getAttributeValue(

        // "http://schemas.android.com/apk/res/com.itheima.mobilesafe80",

        // "sivName");

        // 另一种取属性值的方式:

        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SettingItemView);

        String title = typedArray.getString(R.styleable.SettingItemView_sivName);

        // 一定要调用 recycle

        typedArray.recycle();

        TextView tvTitle = (TextView) view.findViewById(R.id.tv_setting_item_title);

        tvTitle.setText(title);



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


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值