今天写一个自定义控件,为了提高使用者使用效率,需要对一个属性的所有可能属性值进行枚举(即,只能选择使用给出的属性值)
查了很多资料,自己总结一下。
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可以根据需要先给予初始值