Android 自定義屬性的理解和使用

2021-07-14 13:46:18 字數 3065 閱讀 6252

1.在專案檔案res/value下面建立乙個attrs.xml檔案即自定義屬性的宣告檔案,該檔案中包含若干個attr集合,例如:

<?xml version="1.0" encoding="utf-8"?>

其中resource是根標籤,可以在裡面定義若干個declare-styleable,中name定義了屬性集合的名稱,下面可以再自定義多個屬性,針對"/>來說,其屬性的名稱為"testsize",format指定了該屬性型別為dimension,表示尺寸值。

format還可以指定其他的型別比如;

reference   表示引用,參考某一資源id

string   表示字串

color   表示顏色值

dimension   表示尺寸值

boolean   表示布林值

integer   表示整型值

float   表示浮點值

fraction   表示百分數

enum   表示列舉值

flag   表示位運算

ecplise:其中com.cx.test為應用程式包名:

as:以前寫應用程式包名的方法被as廢棄掉了,直接使用res-auto:

接下來就可以在布局檔案中使用自定義屬性啦:

3.在自定義view的**中引入自定義屬性,修改建構函式:

attributeset與typedarray:

構造方法中的有個引數叫做attributeset(eg: myview(context context, attributeset attrs) )這個引數看名字就知道包含的是引數的集合,那麼我能不能通過它去獲取我的自定義屬性呢?首先attributeset中的確儲存的是該view宣告的所有的屬性,並且外面的確可以通過它去獲取(自定義的)屬性,怎麼做呢? 

其實看下attributeset的方法就明白了,下面看**:

public class myview extends view {

private static string tag=myview.class.get******name();

public myview(context context, attributeset attrs) {

super(context, attrs);

//使用attributeset獲取屬性

for (int i=0;i

輸出:e/myview: myview: =name=layout_width=value=100.0dip

e/myview: myview: =name=layout_height=value=100.0dip

e/myview: myview: =name=textsize=value=15.0sp

e/myview: myview: =name=textcolor=value=#ff000000

e/myview: myview: =name=type=value=1

結果果然可以輸出自定義view的所有屬性,也就是通過attributeset可以獲得布局檔案中定義的所有屬性的key和value(還有一些方法,自己去嘗試)。

現在關注下乙個問題:

typedarray是什麼鬼?

我們簡單修改下,布局檔案中的view的屬性:

此時輸出:

e/myview: myview: =name=layout_width=value=100.0dip

e/myview: myview: =name=layout_height=value=100.0dip

e/myview: myview: =name=textsize=value=@2131230794

e/myview: myview: =name=textcolor=value=#ff000000

e/myview: myview: =name=type=value=1

e/myview: myview: =name=bg=value=@2130837504

通過attributeset獲取的值,如果是引用都變成了@+數字的字串。你說,這玩意你能看懂麼?那麼你看看最後一行使用typedarray獲取的值,是不是瞬間明白了什麼。

typedarray其實是用來簡化我們的工作的,比如上例,如果布局中的屬性的值是引用型別(比如:@dimen/myszie),如果使用attributeset去獲得最終的畫素值,那麼需要第一步拿到id,第二步再去解析id。而typedarray正是幫我們簡化了這個過程。

下面使用typedarray:

public class myview extends view {

private static string tag=myview.class.get******name();

public myview(context context, attributeset attrs) {

super(context, attrs);

//使用attributeset獲取屬性

// for (int i=0;i輸出結果:

e/myview: myview: =textsize=20.0sp=type=1=color=-16777216=drawable=android.graphics.drawable.bitmapdrawable@428d6258

可以看出使用typedarray也可以獲取布局檔案中使用引用的屬性。

通過比較可以看出我們在view的構造方法中,可以通過attributeset去獲得自定義屬性的值,但是比較麻煩,而typedarray可以很方便的便於我們去獲取。

Android 自定義屬性

1 在values資料夾下新建xml檔案,命名為attrs.xml,在該檔案中新增你的自定義屬性,例如 2 在布局檔案中使用 首先要定義命名空間xmlns test 命名根據喜好可以隨便取,url中packagename為你專案的包名 具體使用 3 在自定義控制項中讀取 在使用了自定義的屬性後,會呼...

Android 自定義屬性

今天看看如何自定義屬性,先總結一下步驟 1.自定義乙個view 2.在values資料夾下新建attr.xml檔案,在裡面定義自己的屬性 3.在布局檔案中使用自定義的屬性,注意命名空間 4.在構造方法中獲取自定義的屬性 下面我們一步步來講解上面的步驟 1.寫出自己的類 public class cu...

android自定義屬性

建立自定義類myview android layout width wrap content android layout height wrap content sdj name abc sdj age 10 sdj color drawable bg shap 此時會報錯,因為缺少了sdj這個命...