最近在模仿今日頭條,發現它的很多屬性都是通過自定義控件并設定相關的配置屬性進行配置,于是便查詢了解了下declare-styleable,下面我把自己的使用感受和如何使用進行說明下。
declare-styleable:declare-styleable是給自定義控件添加自定義屬性用的。
官方的相關內部控件的配置屬性文檔:http://developer.android.com/reference/android/R.styleable.html
如果不知道如何查看源碼:點擊這里
起初,在自定義控件的時候,會要求構造3個方法中的一個或多個,好比我自定義的控件PersonView,
public PersonView(Context context) {super(context);// TODO Auto-generated constructor stub}public PersonView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stub}public PersonView(Context context, AttributeSet attrs) {super(context, attrs);}
其中的AttributeSet attrs一般都沒給它配置和使用,所以不知道這個東西到底怎么用,后來查看源碼發現,這個配置在默認情況下使用的是系統自己的默認配置,一旦你直接設定了它的屬性,默認屬性就會被你的賦值所替代。
下面我們拿TextView的源碼看看AttributeSet是如何進行操作的。
初始化時候,在布局文件中寫android:text=”拉拉”;
初始化TextView的時候,它的類中的屬性都會初始化;
接著往下看,你可以看到以下代碼:
TypedArray a = theme.obtainStyledAttributes( attrs, com.android.internal.R.styleable.TextViewAppearance, defStyle, 0); TypedArray appearance = null; int ap = a.getResourceId( com.android.internal.R.styleable.TextViewAppearance_textAppearance, -1); a.recycle(); if (ap != -1) { appearance = theme.obtainStyledAttributes( ap, com.android.internal.R.styleable.TextAppearance);
這個就是系統在默認的資源文件R.styleable中去獲取相關的配置。
如果appearance不為空,它就會去尋找獲取相關屬性,接著往下看。
此時的text = “”; 就是準備輸出的字符串初始化。
之后它便會查找你布局文件XML中是否設定給了它text屬性值
之前我們設定過android:text=”拉拉“; 所以它便會得到相關的賦值,之后調用
<span style="font-size:18px;"> setText(text, bufferType); if (hint != null) setHint(hint);</span>
輸出該字符串。當資源檢查賦值完畢后,調用a.recycle();釋放。 同理也可以發現,像hint,textcolor這類屬性都是這么初始化賦值的。
思路:
自定義控件并且自定義屬性的情況下,你可以通過這樣去獲取判斷是否配置了相關的屬性,并進行賦值操作。
從源碼那邊我們大體知道了一個控件的屬性配置和初始化流程,下面就讓我們按照這個思路去自己學習下如何自定義配置。
下面我要寫一個繼承了TextView的PersonView類,給它設定屬性配置,之后實現屬性的顯示。
1.首先,先寫attrs.xml
在res-vlaues文件夾下創建資源文件attrs.xml或則自定義一個資源文件xx.xml,都可以。
之后在里面配置declare-styleable ,name為PersonAttr
<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="PersonAttr"> <attr name="name" format="reference" /> <attr name="sex" format="reference" /> <attr name="age" format="integer" /> <attr name="weight"> <flag name="fat" value="2" /> <flag name="mid" value="1" /> <flag name="thin" value="0" /> </attr> <attr name="adult" format="boolean" /> <attr name="textSize" format="dimension" /> </declare-styleable></resources>
我這里設置了姓名name,性別sex,年齡age,以及特征屬性weight(fat,mid,thin內部的3個屬性及對應的屬性值),還有是否成年adult,和TextView的字體大小textView。
可能這里有人會問,format是什么,里面的單詞代表的又是什么意思。
format就是格式,里面的就是這個屬性對應的格式,下面列出來大致的格式有:
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:顏色值
<declare-styleable name = “名稱”>
<attr name = “textColor” format = “color” />
</declare-styleable>
3. boolean:布爾值
<declare-styleable name = “名稱”>
<attr name = “focusable” format = “boolean” />
</declare-styleable>
4. dimension:尺寸值。注意,這里如果是dp那就會做像素轉換
<declare-styleable name = “名稱”>
<attr name = “layout_width” format = “dimension” />
</declare-styleable>
5. float:浮點值。
6. integer:整型值。
7. string:字符串
8. fraction:百分數。
9. enum:枚舉值
10. flag:是自己定義的,類似于 android:gravity=”top”,就是里面對應了自己的屬性值。
11. reference|color:顏色的資源文件。
12.reference|boolean:布爾值的資源文件
注意://由于reference是從資源文件中獲取:所以在XML文件中寫這個屬性的時候必須 personattr:name=“@string/app_name”這種格式,否則會出錯
2.設置好屬性文件后,在使用的布局中寫相關配置:
<RelativeLayout xmlns:andro xmlns:personattr="http://schemas.android.com/apk/res/com.example.declare_styleable" android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.declare_styleable.PersonView android:layout_width="wrap_content" android:layout_height="wrap_content" personattr:name="@string/person_name" personattr:weight ="fat" personattr:adult ="false" personattr:textSize="@dimen/text_size"/></RelativeLayout>
這里要先應用這個attr:
xmlns:personattr="http://schemas.android.com/apk/res/com.example.declare_styleable"
對應結構是:
xmlns:你自己定義的名稱="http://schemas.android.com/apk/res/你程序的package包名" (我這是com.example.declare_styleable)
包名是配置文件中 package=”com.example.declare_styleable” 這樣格式的
之后在布局中自定義的類中設相關屬性:
你自己定義的名稱:你設的屬性 =”屬性值”;
3.最后在自定義控件的構造方法中獲取你配置的屬性值:
public class PersonView extends TextView {public PersonView(Context context) {super(context);// TODO Auto-generated constructor stub}public PersonView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stub}public PersonView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubTypedArray tArray = context.obtainStyledAttributes(attrs,R.styleable.PersonAttr);//獲取配置屬性String name = tArray.getString(R.styleable.PersonAttr_name);<span style="font-family: Arial, Helvetica, sans-serif;">//得到屬性name</span>int age = tArray.getInt(R.styleable.PersonAttr_age, 15);Boolean adult = tArray.getBoolean(R.styleable.PersonAttr_adult, false);String str_adult = getAdultStatus(adult);int weight = tArray.getInt(R.styleable.PersonAttr_weight, 1);// 默認是中等身材,屬性為:1String str_weight = getWeightStatus(weight);//獲得肥胖屬性float textSize = tArray.getDimension(R.styleable.PersonAttr_textSize,R.dimen.default_text_size);// 如果你設置為DP等單位,會做像素轉換tArray.recycle();//回收資源//setTextSize(textSize);//設置字體大小setText("姓名:" + name + "n" + "年齡:" + age + "n" + "是否成年:" + str_adult+ "n" + "體形:" + str_weight);//給自定義的控件賦值}/** 根據傳入的值判斷是否成年 */public String getAdultStatus(Boolean adult ){String str_adult = "未成年";if (adult) {str_adult = "成年";}return str_adult;}/** 根據傳入的值判斷肥胖狀態 */public String getWeightStatus(int weight){String str_weight = "中等";switch (weight) {case 0:str_weight = "瘦";break;case 1:str_weight = "中等";break;case 2:str_weight = "肥胖";break;default:break;}return str_weight;}}
運行后就是:
這樣,以后我們就可以根據這個方法,去自定義控件并自定義配置屬性了,大大提高了自定義布局的使用效率。
對應的源碼下載地址:下載地址
158672.html
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
成都至北京各次火車列車時刻表?成都到北京有4趟列車,車次及票價,發車時間-到達時間-然后運行時間參考票價T8成都-北京西09336050-14336030 1天,4小時40分,硬座238,硬臥430 K818成都-北京西19336054-22336052 1天,2小時58分,硬座254,硬臥。49K1364成都-北京西22336030-05336019 1天6小時49分硬座231硬臥418 K11...
表格減法公式怎么設置批量自動減?1打開Excel表格,在C1單元格中輸入A1-B1,然后回車。2將鼠標放在C1單元格的右下角。當黑色十字出現時,向下拖動單元格。EXCEL表格如何用減法?1.在Excel表格中進行加減乘除等四則運算,首先要在單元格中輸入等號,然后輸入運算表達式,按回車鍵。2.例如,如果要在單元格A1中輸出100-50相減的結果,可以在單元格A1中輸入100-50,然后按enter鍵...
十大耐用消費品 什么是大型耐用消費品?耐用消費品都指什么? 簡單來說,大型耐用消費品是指使用壽命長,不是一次性用品。常見的有數碼電器、家具、奢侈品包等。價格高的是大型耐用消費品。根據中國工商銀行的規定,是指單價在3000元以下(含3000元)、正常使用壽命在2年以上的家用商品,包括家用電器、電腦、家具、健身器材、衛生潔具、樂器等。換句話說,單價低于3000元或正常使用壽命低于2年的家庭耐用商品...