在開發andorid應用程式中,經常會自定義view來實現各種各樣炫酷的效果,在實現這吊炸天效果的同時,我們往往會定義很多attr屬性,這樣就可以在xml中配置我們想要的屬性值,以下就是定義屬性值可能遇到的各種坑。
先宣告乙個styleable名稱,name名稱最好見名知義,乙個styleable裡面可以有多個attr屬性,每乙個attr都含有乙個name,同時需要指明所能賦值的型別,這是是依靠format來定義的。定義好之後就可以在自定義view中使用,來實現各種吊炸天的效果,使用如下: xml中使用:/>
typedarray a = context.obtainstyledattributes(attrs, r.styleable.sample);根據format不同,還有getdimension,getcolor等方式獲取值。string value = a.getstring(r.styleable.sample.custom);
a.recycle();
上面只是描述了一般定義的方式,但他不是今天的主題,今天的主題是可能遇到的各種坑:
1:專案中只包含乙個attr.xml,出現 attribute "custom" has already been defined,參考鏈結
如上宣告了兩個styleable,同時包含了相同的屬性custom,這時在編譯時會提示attribute "***" has already been defined,表示相同屬性重複定義,相同styleable name不能再同乙個attr.xml中重複定義,styleable name不一致attir也不能重複定義,attr format屬性不影響重複定義結果。因此可以採用如下方法解決該問題:a:重新命名相同屬性名,將其中乙個改為不同的名字 b:提取重複定義attr,作為公共屬性,方式如下:
2: 專案中引用了多個外部專案,出現 attribute "custom" has already been defined 不同的匯入專案中,可能包含多個attr.xml,這樣在定義時極有可能重複定義,他又分為如下兩種情況:a: 主專案,引用庫包含同名styleable name,如: 主專案:
引用庫: 這種情況下,編譯是不會出現錯誤的,可以正常編譯。b: 主專案,引用庫包含不同名styleable,但是有同名attr,如; 主專案:
引用庫: 編譯時會出現 attribute "custom" has already been defined。由此可以得出,在專案中引用各種庫,模組時,各個不同的模組定義attr,要遵循以下規則, 1:全部不能重複定義,全部不能重複很難實現,不同的團隊,不同的產品是極有可能重複定義,因此該方式很難實現。 2:各個不同模組,定義時加上模組字首,這種方式重複機率就小很多,編譯時再將重複的重新命名就ok了。網易雲免費體驗館,0成本體驗20+款雲產品!
Andorid自定義attr的各種坑
在開發andorid應用程式中,經常會自定義view來實現各種各樣炫酷的效果,在實現這吊炸天效果的同時,我們往往會定義很多attr屬性,這樣就可以在xml中配置我們想要的屬性值,以下就是定義屬性值可能遇到的各種坑。custom format string reference declare styl...
Android中attr自定義標籤詳解
xmlns wen android orientation vertical android layout width fill parent android layout height wrap content 第二行是自定義標籤。格式如上,其中 xmlns wen 冒號後面是標籤名,在下面使用時...
Android中attr自定義屬性詳解
xmlns wen android orientation vertical android layout width fill parent android layout height wrap content 第二行是自定義標籤。格式如上,其中 xmlns wen 冒號後面是標籤名,在下面使用時...