自定义控件过程中(自定义属性对应多个固定属性值

12 篇文章 1 订阅

今天写一个自定义控件,为了提高使用者使用效率,需要对一个属性的所有可能属性值进行枚举(即,只能选择使用给出的属性值)

查了很多资料,自己总结一下。

1、自定义属性 在res/values中的attrs.xml中自定义属性。

<declare-styleable name="TestView">    
   <attr name="attrone" format="dimension"/>    
   <attr name="attrtwo" format="string" >    
    <enum name="one" value="0"/>    
    <enum name="two" value="1"/>
   </attr>
    <attr name="type">     
         <enum name="password" value="1" />     
         <enum name="checkButton" value="2" />     
         <enum name="phone" value="3" />        
  </attr> 
<attr name="TextFontStyle">
    <enum name="Roboto_Light" value="0"/>
    <enum name="Roboto_Black" value="1"/>
    <enum name="Roboto_Medium" value="2"/>
    <enum name="DIN_Alternate_Bold" value="3"/>
    <enum name="DIN_Black_Alternate" value="4"/>
    <enum name="DIN_Regular" value="5"/>
    <enum name="DINBlack" value="6"/>
</attr>
</declare-styleable>

分析一下以上代码代表的含义:
declare-styleable: 表示一个属性组。它的name必须和你自定义view的名字相同。
attr:表示单独的一个属性。format代表属性的格式。格式包括很多种:比如颜色,数值,枚举等

    
    

2、使用自定义属性? 首先加入命名空间:xmlns:app="http://schemas.android.com/apk/res-auto" 可以参考:http://zhidao.baidu.com/link?url=-YS2G7N4ymwbEXA5wQE5mu9uvMiLc0UA9a7MBRiajCkpFQl3xX0oNzgHJB7lz9WZFlLoLiaY2UE5BC8zDkAMmDWUOojcyIjmbCELRM-XGoy

通过命名空间就可以使用自定义属性了。

<com.mg.axe.androiddevelop.view.TestView   
   android:layout_width="match_parent"    
   android:layout_height="match_parent"    
   app:attrone="10dp"   
   app:attrtwo="two"    />

获取自定义属性 ?
通过getContext().obtainStyledAttributes()获取TypedArray,
通过TypedArray来获取自定义属性的值。

先建立一个对应attr属性的enum

/**
 * 默认列举出来的字体文件
 */
private enum CustomFontType {
   boboto_Light(0, "Roboto-Light"),
   roboto_Black(1, "Roboto-Black"),
   boboto_Medium(2, "Roboto-Medium"),
   din_Alternate_Bold(3, "DIN_Alternate_Bold"),
   din_Black_Alternate(4, "DIN_Black_Alternate"),
   din_Regular(5, "DIN_Regular"),
   din_Black(6, "DINBlack");
   private int value;
   private String fontName;

   CustomFontType(int value, String fontName) {
      this.value = value;
      this.fontName = fontName;
   }


   public static CustomFontType getFontByValue(int value) {
      switch (value) {
         case 0:
            return boboto_Light;
         case 1:
            return roboto_Black;
         case 2:
            return boboto_Medium;
         case 3:
            return din_Alternate_Bold;
         case 4:
            return din_Black_Alternate;
         case 5:
            return din_Regular;
         case 6:
            return din_Black;
         default:
            return boboto_Light;
      }
   }
}
之后获取属性:

TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.TextView,0,0);
try {
   mCustomFontType = CustomFontType.getFontByValue(typedArray.getInt(R.styleable.TextView_TextFontStyle,fontValue));
   setTypeface(getTypeface(getContext(),mCustomFontType.fontName));
}finally {
   typedArray.recycle();
}
fontValue可以根据需要先给予初始值


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值