布局文件中資源引用的寫法多種多樣移稳,且看以background舉例:
<
……
android:background="@color/colorPrimary"
android:background="@com.demo.app:color/colorPrimary"
android:background="?colorPrimary"
android:background="?attr/colorPrimary"
android:background="?com.demo.app:attr/colorPrimary"
android:background="?com.demo.app:colorPrimary"
android:background="?android:colorPrimary"
android:background="?android:attr/colorPrimary"
……
>
懵ing楞慈。。。塞椎。那么接下來就詳細說說春缕,這些都代表了什么
理解 @ 和 ?
首先我們需要理解@和?分別引用的是什么內(nèi)容
@ :引用資源(resources)
? :引用樣式屬性(style attribute)
詳細來講:
-
使用@ 是引用一個具體的值比如color, string, dimension 等等這些具體的某個值贱田。不管activity是什么主題的孟岛,@引用的值都不會改變。
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#3F51B5</color> </resources>
-
? 是引用一個style attribute针炉,其值取決于當前使用的主題挠他。值為當前主題下定義的屬性值:
<resources> <style name="AppTheme" parent="Theme.AppCompat.Light"> <item name="colorPrimary">#3F51B5</item> </style> </resources> …… <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="?colorPrimary"/>
這樣,TextView的背景色就是當前主題下定義的colorPrimary
語法
引用resources (@)
@[包名:]資源類型/資源名
- 包名:可省略篡帕,即這個資源所屬的package殖侵,默認就是你app的包名,還有一個預留的包——android镰烧,使用系統(tǒng)發(fā)布的資源愉耙。
- 資源類型:R的子集,即資源的類型(color, string, dimen等等)
- 資源名:我們要引用的資源的名稱
例如:
<……
android:background="@color/colorPrimary"
android:background="@com.myapp:color/colorPrimary"
……>
這兩種寫法是等效的:
- package(可不寫) = com.myapp
- 資源類型 = color
- 資源名 = colorPrimary
那么使用系統(tǒng)預定義的資源就是:
<……
android:background="@android:color/holo_orange_dark"
……>
這個例子拆解開來就是:
- package = android – 引用內(nèi)置的資源
- 資源類型 = color
- 資源名 = holo_orange_dark
PS:
使用AppCompat定義的資源的資源時拌滋,常見以下的寫法:
android:background="?selectableItemBackground"
我們并沒有定義這些資源朴沿,也沒有使用預留包名,之所以能這樣使用是因為AppCompat那些資源被整合到了app中败砂,不需要使用android關鍵字來引用赌渣。
引用樣式屬性(?)
語法與@相似
?[包名:][資源類型/]資源名稱
區(qū)別在于,資源類型也是可不寫的,因為這里唯一允許的資源類型是attr昌犹。
下面的表述方式其實完全是一樣的:
<
android:background="?com.demo.app:attr/colorPrimary" //完整寫法
android:background="?com.demo.app:colorPrimary" //省略attr
android:background="?attr/colorPrimary" //省略包名
android:background="?colorPrimary" // 省略包名和 attr
>