Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android手機衛士(十七):自定義屬性

Android手機衛士(十七):自定義屬性

日期:2017/8/18 9:14:00      編輯:Android開發實例

  在前面的文章中,已經實現了“設置中心”第一欄的功能以及布局

Android手機衛士(十七):自定義屬性

  自定義屬性聲明

  接下來實現其他欄的布局和功能,由於它們之間的功能和布局類似,只是屬性名稱不同。所以本文在自定義控件的基礎上實現自定義屬性

  首先參考標准控件的源碼,這裡選擇TextView

  源碼路徑為:D:\adt-bundle-windows-x86_64_20140101\sdk\platforms\android-18\data\res\values

  打開本文件夾下的attrs.xml文件,找到下面的代碼:

XML/HTML代碼
  1. <declare-styleable name="TextView">  
  2. <!-- Determines the minimum type that getText() will return.  
  3.      The default is "normal".  
  4.      Note that EditText and LogTextBox always return Editable,  
  5.      even if you specify something less powerful here. -->  
  6. <attr name="bufferType">  
  7.     <!-- Can return any CharSequence, possibly a  
  8.      Spanned one if the source text was Spanned. -->  
  9.     <enum name="normal" value="0" />  
  10.     <!-- Can only return Spannable. -->  
  11.     <enum name="spannable" value="1" />  
  12.     <!-- Can only return Spannable and Editable. -->  
  13.     <enum name="editable" value="2" />  
  14. </attr>  
  15. <!-- Text to display. -->  
  16. <attr name="text" format="string" localization="suggested" />  
  17. <!-- Hint text to display when the text is empty. -->  
  18. <attr name="hint" format="string" />  

  於是我們也可以模仿關鍵節點,寫出自定義屬性,工程res\values文件夾下新建attrs.xml文件,添加代碼如下:

XML/HTML代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <declare-styleable name="com.wuyudong.mobilesafe.view.SettingItemView">  
  4.         <attr name="destitle" format="string"/>  
  5.         <attr name="desoff" format="string"/>  
  6.         <attr name="deson" format="string"/>  
  7.     </declare-styleable>  
  8. </resources>  

  構造方法中獲取自定義屬性值

  接下來定義命名空間,也是參考android標准來寫

XML/HTML代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3. ……  

  mobilesafe替換掉原有android

  com.wuyudong.mobilesafe必須這樣編寫,替換掉了android,代表當前應用自定義屬性

  xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"

  修改後的代碼如下:

XML/HTML代碼
  1. <com.wuyudong.mobilesafe.view.SettingItemView  
  2.     xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"  
  3.     android:id="@+id/siv_update"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="wrap_content"  
  6.     mobilesafe:destitle="自動更新設置"  
  7.     mobilesafe:desoff="自動更新已關閉"  
  8.     mobilesafe:deson="自動更新已開啟" >  
  9. </com.wuyudong.mobilesafe.view.SettingItemView>  

  自定義屬性值已經搞定,現在是SettingItemView類如何獲取這些值?

  在SettingItemView類的構造函數中調用initAttrs函數,然後通過initAttrs函數實現屬性的返回。先通過一些小的實踐來熟悉相關的API

Java代碼
  1. /** 
  2.  * 返回屬性集合中自定義屬性的屬性值 
  3.  * @param attrs  構造方法中維護好的屬性集合 
  4.  */  
  5. private void initAttrs(AttributeSet attrs) {  
  6.     //獲取屬性的總個數  
  7.     Log.i(tag,"attrs.getAttributeCount(): " + attrs.getAttributeCount());  
  8.     //獲取屬性名稱以及屬性值  
  9.     for (int i = 0; i < attrs.getAttributeCount(); i++) {  
  10.         Log.i(tag, "name = " + attrs.getAttributeName(i));  
  11.         Log.i(tag, "value = " + attrs.getAttributeValue(i));  
  12.         Log.i(tag, "==================分割線======================");  
  13.     }  
  14. }

  運行項目後在Logcat中打印下面的日志信息:

Android手機衛士(十七):自定義屬性

  解釋一下上面的部分代碼:

  value = @2131427413對應的十六進制值為:7F0B0055,其實就是對應的R文件中

Java代碼
  1. public static final int siv_update=0x7f0b0055;  

  其他的都很簡單

  接著我們使用其他的API來進行獲取屬性的值

Java代碼
  1. private static final String NAMESPACE = "http://schemas.android.com/apk/res/com.wuyudong.mobilesafe";  
  2. .......  
  3.   
  4. /** 
  5.  * 返回屬性集合中自定義屬性的屬性值 
  6.  * @param attrs  構造方法中維護好的屬性集合 
  7.  */  
  8. private void initAttrs(AttributeSet attrs) {  
  9.  /*   //獲取屬性的總個數 
  10.     Log.i(tag,"attrs.getAttributeCount(): "+attrs.getAttributeCount()); 
  11.     //獲取屬性名稱以及屬性值 
  12.     for (int i = 0; i < attrs.getAttributeCount(); i++) { 
  13.         Log.i(tag, "name = " + attrs.getAttributeName(i)); 
  14.         Log.i(tag, "value = " + attrs.getAttributeValue(i)); 
  15.         Log.i(tag, "==================分割線======================"); 
  16.     }*/  
  17.     String destitle = attrs.getAttributeValue(NAMESPACE, "destitle");  
  18.     String desoff = attrs.getAttributeValue(NAMESPACE, "desoff");  
  19.     String deson = attrs.getAttributeValue(NAMESPACE, "deson");  
  20.     Log.i(tag, destitle);  
  21.     Log.i(tag, desoff);  
  22.     Log.i(tag, deson);  
  23. }  

  運行項目後在Logcat中打印下面的日志信息:

Android手機衛士(十七):自定義屬性

  說明已經成功獲取所設置的屬性值

  這樣就可以復用代碼實現第二欄的電話歸屬地的布局

XML/HTML代碼
  1. <com.wuyudong.mobilesafe.view.SettingItemView  
  2.     xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"  
  3.     android:id="@+id/siv_update"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="wrap_content"  
  6.     mobilesafe:destitle="自動更新設置"  
  7.     mobilesafe:desoff="自動更新已關閉"  
  8.     mobilesafe:deson="自動更新已開啟" >  
  9. </com.wuyudong.mobilesafe.view.SettingItemView>  
  10.   
  11. <com.wuyudong.mobilesafe.view.SettingItemView  
  12.     xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"  
  13.     android:layout_width="match_parent"  
  14.     android:layout_height="wrap_content"  
  15.     mobilesafe:destitle="電話歸屬地的顯示設置"  
  16.     mobilesafe:desoff="歸屬地的顯示已關閉"  
  17.     mobilesafe:deson="歸屬地的顯示已開啟" >  
  18. </com.wuyudong.mobilesafe.view.SettingItemView>  
XML/HTML代碼
  1. <com.wuyudong.mobilesafe.view.SettingItemView  
  2.         xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"  
  3.         android:id="@+id/siv_update"  
  4.         android:layout_width="match_parent"  
  5.         android:layout_height="wrap_content"  
  6.         mobilesafe:destitle="自動更新設置"  
  7.         mobilesafe:desoff="自動更新已關閉"  
  8.         mobilesafe:deson="自動更新已開啟" >  
  9.     </com.wuyudong.mobilesafe.view.SettingItemView>  
  10.   
  11.     <com.wuyudong.mobilesafe.view.SettingItemView  
  12.         xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"  
  13.         android:layout_width="match_parent"  
  14.         android:layout_height="wrap_content"  
  15.         mobilesafe:destitle="電話歸屬地的顯示設置"  
  16.         mobilesafe:desoff="歸屬地的顯示已關閉"  
  17.         mobilesafe:deson="歸屬地的顯示已開啟" >  
  18.     </com.wuyudong.mobilesafe.view.SettingItemView> 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved