Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android 手機衛士--自定義屬性,android衛士

Android 手機衛士--自定義屬性,android衛士

編輯:關於android開發

Android 手機衛士--自定義屬性,android衛士


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

本文地址:http://www.cnblogs.com/wuyudong/p/5936016.html,轉載請注明出處。

自定義屬性聲明

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

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

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

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

    <declare-styleable name="TextView">
        <!-- Determines the minimum type that getText() will return.
             The default is "normal".
             Note that EditText and LogTextBox always return Editable,
             even if you specify something less powerful here. -->
        <attr name="bufferType">
            <!-- Can return any CharSequence, possibly a
             Spanned one if the source text was Spanned. -->
            <enum name="normal" value="0" />
            <!-- Can only return Spannable. -->
            <enum name="spannable" value="1" />
            <!-- Can only return Spannable and Editable. -->
            <enum name="editable" value="2" />
        </attr>
        <!-- Text to display. -->
        <attr name="text" format="string" localization="suggested" />
        <!-- Hint text to display when the text is empty. -->
        <attr name="hint" format="string" />

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

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="com.wuyudong.mobilesafe.view.SettingItemView">
        <attr name="destitle" format="string"/>
        <attr name="desoff" format="string"/>
        <attr name="deson" format="string"/>
    </declare-styleable>
</resources>

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

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
……

mobilesafe替換掉原有android

com.wuyudong.mobilesafe必須這樣編寫,替換掉了android,代表當前應用自定義屬性
xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"

修改後的代碼如下:

    <com.wuyudong.mobilesafe.view.SettingItemView
        xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"
        android:id="@+id/siv_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        mobilesafe:destitle="自動更新設置"
        mobilesafe:desoff="自動更新已關閉"
        mobilesafe:deson="自動更新已開啟" >
    </com.wuyudong.mobilesafe.view.SettingItemView>

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

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

   /**
     * 返回屬性集合中自定義屬性的屬性值
     * @param attrs  構造方法中維護好的屬性集合
     */
    private void initAttrs(AttributeSet attrs) {
        //獲取屬性的總個數
        Log.i(tag,"attrs.getAttributeCount(): " + attrs.getAttributeCount());
        //獲取屬性名稱以及屬性值
        for (int i = 0; i < attrs.getAttributeCount(); i++) {
            Log.i(tag, "name = " + attrs.getAttributeName(i));
            Log.i(tag, "value = " + attrs.getAttributeValue(i));
            Log.i(tag, "==================分割線======================");
        }
    }

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

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

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

public static final int siv_update=0x7f0b0055;

其他的都很簡單

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

private static final String NAMESPACE = "http://schemas.android.com/apk/res/com.wuyudong.mobilesafe";
...........

 /**
     * 返回屬性集合中自定義屬性的屬性值
     * @param attrs  構造方法中維護好的屬性集合
     */
    private void initAttrs(AttributeSet attrs) {
     /*   //獲取屬性的總個數
        Log.i(tag,"attrs.getAttributeCount(): "+attrs.getAttributeCount());
        //獲取屬性名稱以及屬性值
        for (int i = 0; i < attrs.getAttributeCount(); i++) {
            Log.i(tag, "name = " + attrs.getAttributeName(i));
            Log.i(tag, "value = " + attrs.getAttributeValue(i));
            Log.i(tag, "==================分割線======================");
        }*/
        String destitle = attrs.getAttributeValue(NAMESPACE, "destitle");
        String desoff = attrs.getAttributeValue(NAMESPACE, "desoff");
        String deson = attrs.getAttributeValue(NAMESPACE, "deson");
        Log.i(tag, destitle);
        Log.i(tag, desoff);
        Log.i(tag, deson);
    }

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

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

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

    <com.wuyudong.mobilesafe.view.SettingItemView
        xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"
        android:id="@+id/siv_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        mobilesafe:destitle="自動更新設置"
        mobilesafe:desoff="自動更新已關閉"
        mobilesafe:deson="自動更新已開啟" >
    </com.wuyudong.mobilesafe.view.SettingItemView>

    <com.wuyudong.mobilesafe.view.SettingItemView
        xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        mobilesafe:destitle="電話歸屬地的顯示設置"
        mobilesafe:desoff="歸屬地的顯示已關閉"
        mobilesafe:deson="歸屬地的顯示已開啟" >
    </com.wuyudong.mobilesafe.view.SettingItemView>

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved