@android, ?attr/ 和 ?android 的區(qū)別

前言:安卓開發(fā)中我們時常會需要引用一些特殊的資源榄棵,比如設(shè)置一些可點擊組件的波紋效果時凝颇,我們會用到:android:foreground="?attr/selectableItemBackground",但是這些引用方式之間有哪些區(qū)別呢秉继?

獲取資源

首先來復(fù)習(xí)一下安卓中獲取資源的幾種方式祈噪。

@[<package_name>:]<resource_type>/<resource_name>

這種方式是最為常見的泽铛,直接獲取對應(yīng)的包下的資源尚辑,一般在相同的包下,可以省略包名盔腔,比如為 TextView 設(shè)置文字時杠茬,就可以通過這樣的方式來獲取我們應(yīng)用內(nèi)定義的 string 資源:

android:text="@string/hello"

另一種獲取資源的方式是通過引用 style 屬性。

android:textColor="?colorAccent"

通過這種方式弛随,我們可以獲取到當(dāng)前應(yīng)用主題下的 style 屬性值瓢喉,這些屬性值一般可以在屬性文件夾 values 下找到。這里由于當(dāng)前使用的是 Theme.AppCompat 下的主題舀透,這是 com.android.support:appcompat-v7 下的 Theme栓票,所以 colorAccent 會指向該庫下的 values 文件:

appcompat-v7 包下的 colorAccent 屬性

關(guān)于資源引用的方式,具體請參考官方文檔:Accessing your app resources

01 @android: 引用安卓內(nèi)建的系統(tǒng)資源

除了引用自己應(yīng)用中的資源外愕够,我們還可以通過指定引用時的包名為 android 來獲取安卓平臺下的一些系統(tǒng)資源走贪,舉個例子:

android:background=“@android:drawable/ic_menu_delete”

我們知道當(dāng)新建一個項目的時候,必須在 gradle 中設(shè)置 compileSdkVersion 來指定編譯我們應(yīng)用的 SDK 版本惑芭,這也決定了我們能調(diào)用哪個 level 的 API坠狡,同時也表明了哪個 level 的系統(tǒng)資源可供我們使用,比如如果指定的 compileSdkVersion 是 27遂跟,那么我們調(diào)用的就是 Android 8.1 下的系統(tǒng)資源逃沿。

@android:drawable/ic_menu_delete

02 ?attr/: 引用應(yīng)用內(nèi)的屬性資源

通過這種方式可以讓我們間接地使用應(yīng)用內(nèi)的某些資源婴渡。我們知道當(dāng)我們自定義View的時候,一般會需要自定義一些屬性資源凯亮,通常我們會在 values/ 文件夾下建一個 attrs 文件边臼,在這里保存一些我們自己的 style 屬性,其實這些屬性就可以通過 ?attr/ 這種方式來引用了假消。比如我在 styles 里定義了一個屬性:

<attr name="colorReallyGreen" format="color"/>

定義完之后硼瓣,我就可以直接在 layout 中通過引用的方式去使用這個屬性了:

android:background="?attr/colorReallyGreen"

當(dāng)然,要想讓該屬性起作用還需要在 Theme 下指定值:

在當(dāng)前 Theme 下為自定義屬性賦值

另外置谦,由于在 layout 中堂鲤,可以自動識別出當(dāng)前所需的是屬性資源,所以可以省略 attr/ 而直接使用 ?colorReallyGreen 就可以了媒峡。

03 ?android: 引用系統(tǒng)內(nèi)建的屬性資源

了解了前兩種資源引用的方式后瘟栖,?android 這種引用資源的方式也就不難理解了。與 ?attr/ 類似谅阿,通過這種方式可以直接訪問到安卓內(nèi)建的屬性資源半哟,只不過是省略了 attr/ 而已。比如給 TextView 引用一個系統(tǒng)內(nèi)的 style buttonStyleSmall

<TextView
    style="?android:buttonStyleSmall"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="You Are Beautiful" />

然后 TextView 就變成了這樣:

引用了安卓內(nèi)建屬性作為 style 的 TextView

當(dāng)然如果你嘗試去掉 android 包名之后签餐,發(fā)現(xiàn)該屬性還是可以起作用寓涨,說明應(yīng)用內(nèi)也是可以引用這個資源的。那么這是不是意味著絕大部分屬性資源都不需要加 android 包名呢氯檐?其實我覺得是這樣的戒良,因為加了包名之后其實限制反而會更多,比如有些內(nèi)建屬性資源是針對某個 API level 以上的 Android 平臺才可以使用的冠摄,當(dāng)然這也與你當(dāng)前使用的 Theme 有關(guān)糯崎。

結(jié)語

總結(jié)下,獲取資源有兩種方式河泳,一種是通過直接引用(使用 @)沃呢,一種是通過 style 屬性(使用 ?,除了自定義屬性外拆挥,引用的資源類型和當(dāng)前使用的主題有關(guān))薄霜。另外系統(tǒng)中內(nèi)置了不少資源,學(xué)會合理利用它們可以幫助我們節(jié)約不少時間纸兔,建議大家花點精力自己探索下惰瓜。


參考:

  1. What‘s the difference between “?android:attr/” and “?attr/” in an android layout xml file?
  2. Difference between “?attr/” and “?android:attr/” in android
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市食拜,隨后出現(xiàn)的幾起案子鸵熟,更是在濱河造成了極大的恐慌,老刑警劉巖负甸,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件流强,死亡現(xiàn)場離奇詭異痹届,居然都是意外死亡,警方通過查閱死者的電腦和手機打月,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門队腐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奏篙,你說我怎么就攤上這事柴淘。” “怎么了秘通?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵为严,是天一觀的道長。 經(jīng)常有香客問我肺稀,道長第股,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任话原,我火速辦了婚禮夕吻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘繁仁。我一直安慰自己涉馅,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布黄虱。 她就那樣靜靜地躺著稚矿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悬钳。 梳的紋絲不亂的頭發(fā)上盐捷,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天偶翅,我揣著相機與錄音默勾,去河邊找鬼。 笑死聚谁,一個胖子當(dāng)著我的面吹牛母剥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播形导,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼环疼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了朵耕?” 一聲冷哼從身側(cè)響起炫隶,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阎曹,沒想到半個月后伪阶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煞檩,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年栅贴,在試婚紗的時候發(fā)現(xiàn)自己被綠了斟湃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡檐薯,死狀恐怖凝赛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坛缕,我是刑警寧澤墓猎,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站赚楚,受9級特大地震影響陶衅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜直晨,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一搀军、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧勇皇,春花似錦罩句、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兄淫,卻和暖如春屯远,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捕虽。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工慨丐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泄私。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓房揭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晌端。 傳聞我的和親對象是個殘疾皇子捅暴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355