在Android開發中,往往要用到自定義的控件來實現我們的需求或效果。在使用自定義?
控件時,難免要用到自定義屬性,那怎么使用自定義屬性呢?
一、簡單使用:
?
1.在文件res/values/下新建attrs.xml屬性文件,中定義我們所需要的屬性:
<resources><!-- resource是跟標簽,可以在里面定義若干個declare-styleable -->
<declare-styleable name="custom_view"><!-- name定義了變量的名稱 --><attr name="custom_color" format="color"></attr> <!-- 定義對應的屬性,name定義了屬性的名稱 --><attr name="custom_size" format="dimension"></attr> <!--每一個發生要定義format指定其類型,類型包括 reference 表示引用,參考某一資源IDstring 表示字符串color 表示顏色值dimension 表示尺寸值boolean 表示布爾值integer 表示整型值float 表示浮點值fraction 表示百分數enum 表示枚舉值flag 表示位運算-->
</declare-styleable>
2.在布局中使用:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:ldm="http://schemas.android.com/apk/res/com.ldm.learn"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#f6f6f6"android:orientation="vertical"android:padding="10dp" ><com.ldm.learn.CustomTextViewandroid:layout_width="100dp"android:layout_height="100dp"android:text="自定義TextView"ldm:custom_color="#333333"ldm:custom_size="35sp" /></LinearLayout>
2.在代碼中引用:
public class CustomTextView extends TextView {
private int textSize;//自定義文件大小
? ? ?private int textColor;//自定義文字顏色
? ? //自定義屬性,會調用帶兩個參數的構造方法
? ? public CustomTextView(Context context, AttributeSet attrs) {
? ? ? ? ? ?super(context, attrs);
? ? ? ? ? ?TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.custom_view);//TypedArray屬性對象
? ? ? ? ? ? textSize = ta.getDimensionPixelSize(R.styleable.custom_view_custom_size, 20);//獲取屬性對象中對應的屬性值
? ? ? ? ? ?textColor = ta.getColor(R.styleable.custom_view_custom_color, 0x0000ff);
? ? ? ? ? ?setColorAndSize(textColor, textSize);//設置屬性
? ? ? ? ? ?ta.recycle();
}
? ?public CustomTextView(Context context){
? ? ? ? ? ?super(context);
}
? ?private void setColorAndSize(int textColor, int textSize){
? ? ? ? ? ?setTextColor(textColor);
? ? ? ? ? setTextSize(textSize);
}
}
?
?
?
二、declare-styleable屬性詳解:
?
1. reference:參考某一資源ID。
??? (1)屬性定義:
??????????? <declare-styleable name = "名稱">
?????????????????? <attr name = "background" format = "reference" />
??????????? </declare-styleable>
??? (2)屬性使用:
???????????? <ImageView
???????????????????? android:layout_width = "42dip"
???????????????????? android:layout_height = "42dip"
???????????????????? android:background = "@drawable/圖片ID"
???????????????????? />
2. color:顏色值。
??? (1)屬性定義:
??????????? <declare-styleable name = "名稱">
?????????????????? <attr name = "textColor" format = "color" />
??????????? </declare-styleable>
??? (2)屬性使用:
??????????? <TextView
???????????????????? android:layout_width = "42dip"
???????????????????? android:layout_height = "42dip"
???????????????????? android:textColor = "#00FF00"
???????????????????? />
3. boolean:布爾值。
??? (1)屬性定義:
??????????? <declare-styleable name = "名稱">
?????????????????? <attr name = "focusable" format = "boolean" />
??????????? </declare-styleable>
??? (2)屬性使用:
??????????? <Button
??????????????????? android:layout_width = "42dip"
??????????????????? android:layout_height = "42dip"
??????????????????? android:focusable = "true"
??????????????????? />
4. dimension:尺寸值。
??? (1)屬性定義:
??????????? <declare-styleable name = "名稱">
?????????????????? <attr name = "layout_width" format = "dimension" />
??????????? </declare-styleable>
??? (2)屬性使用:
??????????? <Button
??????????????????? android:layout_width = "42dip"
??????????????????? android:layout_height = "42dip"
??????????????????? />
5. float:浮點值。
??? (1)屬性定義:
??????????? <declare-styleable name = "AlphaAnimation">
?????????????????? <attr name = "fromAlpha" format = "float" />
?????????????????? <attr name = "toAlpha" format = "float" />
??????????? </declare-styleable>
??? (2)屬性使用:
??????????? <alpha
?????????????????? android:fromAlpha = "1.0"
?????????????????? android:toAlpha = "0.7"
?????????????????? />
6. integer:整型值。
??? (1)屬性定義:
??????????? <declare-styleable name = "AnimatedRotateDrawable">
?????????????????? <attr name = "visible" />
?????????????????? <attr name = "frameDuration" format="integer" />
?????????????????? <attr name = "framesCount" format="integer" />
?????????????????? <attr name = "pivotX" />
?????????????????? <attr name = "pivotY" />
?????????????????? <attr name = "drawable" />
??????????? </declare-styleable>
??? (2)屬性使用:
??????????? <animated-rotate
?????????????????? xmlns:android = "http://schemas.android.com/apk/res/android"?
?????????????????? android:drawable = "@drawable/圖片ID"?
?????????????????? android:pivotX = "50%"?
?????????????????? android:pivotY = "50%"?
?????????????????? android:framesCount = "12"?
?????????????????? android:frameDuration = "100"
?????????????????? />
7. string:字符串。
??? (1)屬性定義:
??????????? <declare-styleable name = "MapView">
?????????????????? <attr name = "apiKey" format = "string" />
??????????? </declare-styleable>
??? (2)屬性使用:
??????????? <com.google.android.maps.MapView
??????????????????? android:layout_width = "fill_parent"
??????????????????? android:layout_height = "fill_parent"
??????????????????? android:apiKey = "0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g"
??????????????????? />
8. fraction:百分數。
??? (1)屬性定義:
??????????? <declare-styleable name="RotateDrawable">
?????????????????? <attr name = "visible" />
?????????????????? <attr name = "fromDegrees" format = "float" />
?????????????????? <attr name = "toDegrees" format = "float" />
?????????????????? <attr name = "pivotX" format = "fraction" />
?????????????????? <attr name = "pivotY" format = "fraction" />
?????????????????? <attr name = "drawable" />
??????????? </declare-styleable>
??? (2)屬性使用:
??????????? <rotate
?????????????????? xmlns:android = "http://schemas.android.com/apk/res/android"
???????????? android:interpolator = "@anim/動畫ID"
?????????????????? android:fromDegrees = "0"
???????????? android:toDegrees = "360"
?????????????????? android:pivotX = "200%"
?????????????????? android:pivotY = "300%"
???????????? android:duration = "5000"
?????????????????? android:repeatMode = "restart"
?????????????????? android:repeatCount = "infinite"
?????????????????? />
9. enum:枚舉值。
??? (1)屬性定義:
??????????? <declare-styleable name="名稱">
?????????????????? <attr name="orientation">
????????????????????????? <enum name="horizontal" value="0" />
????????????????????????? <enum name="vertical" value="1" />
?????????????????? </attr>????????? ?
??????????? </declare-styleable>
??? (2)屬性使用:
??????????? <LinearLayout
??????????????????? xmlns:android = "http://schemas.android.com/apk/res/android"
??????????????????? android:orientation = "vertical"
??????????????????? android:layout_width = "fill_parent"
??????????????????? android:layout_height = "fill_parent"
??????????????????? >
??????????? </LinearLayout>
10. flag:位或運算。
???? (1)屬性定義:
???????????? <declare-styleable name="名稱">
??????????????????? <attr name="windowSoftInputMode">
??????????????????????????? <flag name = "stateUnspecified" value = "0" />
??????????????????????????? <flag name = "stateUnchanged" value = "1" />
??????????????????????????? <flag name = "stateHidden" value = "2" />
??????????????????????????? <flag name = "stateAlwaysHidden" value = "3" />
??????????????????????????? <flag name = "stateVisible" value = "4" />
??????????????????????????? <flag name = "stateAlwaysVisible" value = "5" />
??????????????????????????? <flag name = "adjustUnspecified" value = "0x00" />
??????????????????????????? <flag name = "adjustResize" value = "0x10" />
??????????????????????????? <flag name = "adjustPan" value = "0x20" />
??????????????????????????? <flag name = "adjustNothing" value = "0x30" />
???????????????????? </attr>?????? ?
???????????? </declare-styleable>
???? (2)屬性使用:
??????????? <activity
?????????????????? android:name = ".StyleAndThemeActivity"
?????????????????? android:label = "@string/app_name"
?????????????????? android:windowSoftInputMode = "stateUnspecified | stateUnchanged | stateHidden">
?????????????????? <intent-filter>
????????????????????????? <action android:name = "android.intent.action.MAIN" />
????????????????????????? <category android:name = "android.intent.category.LAUNCHER" />
?????????????????? </intent-filter>
???????????? </activity>
特別要注意:
???? 屬性定義時可以指定多種類型值。
??? (1)屬性定義:
??????????? <declare-styleable name = "名稱">
?????????????????? <attr name = "background" format = "reference|color" />
??????????? </declare-styleable>
??? (2)屬性使用:
???????????? <ImageView
???????????????????? android:layout_width = "42dip"
???????????????????? android:layout_height = "42dip"
???????????????????? android:background = "@drawable/圖片ID|#00FF00"
???????????????????? />
轉載:http://blog.csdn.net/langxinlen/article/details/50343175