在Android 中我们习惯了在XML布局文件中,进行控件属性的设置,由于控件默认提供的属性数量有限,为了增加属性我们可以给控件添加一些自定义的属性,下面来讲一下为控件添加自定义属性的几个步骤。
1>在res/values文件下添加一个attrs.xml文件(没有的话)如下:
<? xml version = "1.0" encoding = "utf-8" ?> < resources > < declare-styleable name = "ImageTextButton" > < attr format = "reference" name = "iconImage" /> < attr format = "reference" name = "bkImage" /> < attr format = "integer" name = "borderLeft" /> < attr format = "integer" name = "borderRight" /> < attr format = "integer" name = "borderTop" /> < attr format = "integer" name = "borderBottom" /> < attr format = "integer" name = "buttonstate" /> < attr name = "iconLocation" > < enum name = "center" value = "0" /> < enum name = "left" value = "1" /> < enum name = "right" value = "2" /> </ attr > </ declare-styleable > </ resources >
2>在相关的XML布局文件中使用自定义的属性:
<? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns: mux = "http://schemas.android.com/apk/res/com.shareboard " android:layout_width = "530dp" android:layout_height = "320dp" android:background = "@color/dlgBg" android:orientation = "vertical" > < com.shareboard.uicontrols.ImageTextButton android:id = "@+id/btnCancel" android:layout_width = "100sp" android:layout_height = "wrap_content" android:layout_alignParentRight = "true" android:layout_marginRight = "20dp" mux :bkImage = "@drawable/cell_bkgnd" mux :buttonstate = "2" android:text = "@string/btn_cancel" android:textColor = "@color/btnText" android:textSize = "@dimen/btnText" /> < com.shareboard.uicontrols.ImageTextButton android:id = "@+id/btnDone" android:layout_width = "100sp" android:layout_height = "wrap_content" android:layout_alignParentLeft = "true" android:layout_marginLeft = "@dimen/btnMargin" mux :bkImage = "@drawable/cell_bkgnd" mux :buttonstate = "2" android:text = "@string/btn_done" android:textColor = "@color/btnText" android:textSize = "@dimen/btnText" /> </ LinearLayout >
3>在代码中获取自定义的属性值:
public final class ImageTextButton extends Button { private int mIconId; private int mBkimgId; private int mBorderLeft = 10 ; private int mBorderRight = 10 ; private int mBorderTop = 10 ; private int mBorderBottom = 10 ; private int mnButtonState = 4 ; private int mIconLocation = 0 ; private boolean mbChecked = false ; public ImageTextButton(Context context) { super (context); setClickable(true ); } public ImageTextButton(Context context, AttributeSet attrs) { super (context, attrs); readAttrs(context, attrs); setClickable(true ); } private void readAttrs(Context context, AttributeSet attrs) { TypedArray types = context.obtainStyledAttributes(attrs, R.styleable.ImageTextButton); final int count = types.getIndexCount(); for ( int i = 0 ; i < count; ++i) { int attr = types.getIndex(i); switch (attr) { case R.styleable.ImageTextButton_iconImage: mIconId = types.getResourceId(attr, 0 ); break ; case R.styleable.ImageTextButton_bkImage: mBkimgId = types.getResourceId(attr, 0 ); break ; case R.styleable.ImageTextButton_borderLeft: mBorderLeft = types.getInteger(attr, 10 ); break ; case R.styleable.ImageTextButton_borderRight: mBorderRight = types.getInteger(attr, 10 ); break ; case R.styleable.ImageTextButton_borderTop: mBorderTop = types.getInteger(attr, 10 ); break ; case R.styleable.ImageTextButton_borderBottom: mBorderBottom = types.getInteger(attr, 10 ); break ; case R.styleable.ImageTextButton_iconLocation: mIconLocation = types.getInteger(attr, 0 ); break ; case R.styleable.ImageTextButton_buttonstate: mnButtonState = types.getInteger(attr, 4 ); break ; } } types.recycle(); } }
好了这就完成了自定义属性的定义和使用。