閑談Android中的@和胚膊?符號(hào)的引用區(qū)別

在 Android 項(xiàng)目開發(fā)中,我們經(jīng)常會(huì)用 “@” 或者 “?” 符號(hào)去引用系統(tǒng)或者我們應(yīng)用內(nèi)添加的資源胁澳,這兩種符號(hào)的引用有什么區(qū)別呢,“?attr/” 與 “?android:attr/” 之間又有怎樣的不同呢?本文我們不妨閑聊一下米者。

“@” 與 “?” 符號(hào)的引用在使用時(shí)都有一個(gè)規(guī)范的格式:"@[+][package:]type:name"韭畸,"?[package:][type:]name"÷悖可以看到胰丁,二者均包含引用符號(hào)、資源所屬的包喂分、資源類型和資源名稱锦庸。

@ 資源引用

“@” 符號(hào)用于引用系統(tǒng)和我們?cè)陧?xiàng)目中添加的一些固有資源(drawable,string 等)蒲祈,或者定義的 style 樣式甘萧。比如:

android:text="@string/app_name" ```
這里的 app_name 就是我們自己定義在項(xiàng)目文件 values/strings.xml 中的字符串資源。

android:text="@android:string/cancel" ```
而這里的 cancel 屬于 Android SDK 中的系統(tǒng)字符串資源梆掸,所以需要添加@android: 來(lái)指明引用來(lái)源扬卷。android: 是 package: 的一個(gè)具體實(shí)例。

? 屬性引用

“?” 符號(hào)用于引用當(dāng)前主題中定義的一些屬性值酸钦。注意怪得,“?” 符號(hào)通過(guò)屬性名字間接引用當(dāng)前主題中的對(duì)應(yīng)屬性值,而不是屬性本身卑硫。舉個(gè)例子:

android:divider="?android:listDivider" ```
這里的 “?” 符號(hào)通過(guò)屬性名 android:listDivider 間接獲取當(dāng)前主題賦予該屬性的值徒恋。如同 @android: 一般,?android: 表示該值源自 Android SDK 系統(tǒng)屬性拔恰。由于在當(dāng)前主題中尋找對(duì)應(yīng)屬性名的值因谎,所以沒有指定屬性類型基括,其實(shí)等同于:?android:attr/listDivider颜懊。

那如何引用項(xiàng)目中自定義的屬性呢?我們?cè)?attrs.xml 中定義一個(gè)屬性,如:

<declare-styleable name="CustomTextView">
<attr name="colorTextCustom" format="reference|color"/>
</declare-styleable> ```
顯然,此時(shí)我們定義的 colorTextCustom 屬性是沒有值的河爹,直接引用沒有任何作用匠璧。需要在主題 style 中賦值:

<style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="colorTextCustom">#FF0000</item> 
</style> 
 
<style name="AppTheme" parent="BaseTheme"> 
    <item name="android:textColor">?colorTextCustom</item> 
</style> ```
可以看到,這里在 BaseTheme 中對(duì) colorTextCustom 屬性賦值咸这,并在 AppTheme 中通過(guò) “?colorTextCustom” 引用該屬性值夷恍。由于是本地項(xiàng)目中定義的屬性,所以沒有添加 android: 命名空間媳维。其實(shí)酿雪,這種做法的好處是,AppTheme 所覆蓋的 View 均可通過(guò)構(gòu)造函數(shù)獲取當(dāng)前主題中的 colorTextCustom 屬性值侄刽。

**R.attr & R.style**

Android SDK 中定義有很多屬性和主題可供使用指黎,詳見官方文檔:R.attr &R.style。使用系統(tǒng)資源的好處就是州丹,滿足不同系統(tǒng)的適配需求醋安,較為靈活。

這里舉幾個(gè)常用的:

style="?android:attr/borderlessButtonStyle"```

Android 5.0 默認(rèn) Button 的樣式自帶邊框陰影墓毒,可以使用這個(gè)系統(tǒng)樣式去除該樣式吓揪。當(dāng)然,這是單獨(dú)設(shè)置時(shí)的操作所计,為了方便全局控制柠辞,可以在 styles.xml 中自定義一個(gè)樣式,繼承一個(gè)無(wú)邊框樣式作為 parent:

<style name="CustomBorderlessButtonStyle" parent="@style/Widget.AppCompat.Button.Borderless"> 
    <item name="android:textColor">@android:color/white</item> 
    ... 
</style> ```
**android:background="?android:attr/selectableItemBackground"**

可用于設(shè)置一些 List Item主胧、Button之類帶點(diǎn)擊效果的背景钾腺。該樣式自帶觸摸點(diǎn)擊效果,在 5.0 和更高版本上讥裤,更是附有 Ripple 漣漪效果放棒,省去我們自己實(shí)現(xiàn) selector 選擇器的過(guò)程。當(dāng)然我們也可以自己使用 <ripple> 標(biāo)簽定義一個(gè) drawable 文件實(shí)現(xiàn)漣漪效果己英,只是需要注意版本限制间螟。

**android:background="?android:attr/dividerVertical"**

實(shí)現(xiàn)分割線背景。

還有一些其他有用的系統(tǒng)資源损肛,這里就不一一列舉了...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厢破,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子治拿,更是在濱河造成了極大的恐慌摩泪,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劫谅,死亡現(xiàn)場(chǎng)離奇詭異见坑,居然都是意外死亡嚷掠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門荞驴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)不皆,“玉大人,你說(shuō)我怎么就攤上這事熊楼∨Γ” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵鲫骗,是天一觀的道長(zhǎng)犬耻。 經(jīng)常有香客問(wèn)我,道長(zhǎng)执泰,這世上最難降的妖魔是什么香追? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮坦胶,結(jié)果婚禮上透典,老公的妹妹穿的比我還像新娘。我一直安慰自己顿苇,他們只是感情好峭咒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纪岁,像睡著了一般凑队。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幔翰,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天漩氨,我揣著相機(jī)與錄音,去河邊找鬼遗增。 笑死叫惊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的做修。 我是一名探鬼主播霍狰,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼饰及!你這毒婦竟也來(lái)了蔗坯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤燎含,失蹤者是張志新(化名)和其女友劉穎宾濒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屏箍,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绘梦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年橘忱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谚咬。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹦付,死狀恐怖尚粘,靈堂內(nèi)的尸體忽然破棺而出择卦,到底是詐尸還是另有隱情,我是刑警寧澤郎嫁,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布秉继,位于F島的核電站,受9級(jí)特大地震影響泽铛,放射性物質(zhì)發(fā)生泄漏尚辑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一盔腔、第九天 我趴在偏房一處隱蔽的房頂上張望杠茬。 院中可真熱鬧,春花似錦弛随、人聲如沸瓢喉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)栓票。三九已至,卻和暖如春愕够,著一層夾襖步出監(jiān)牢的瞬間走贪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工惑芭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坠狡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓遂跟,卻偏偏與公主長(zhǎng)得像擦秽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漩勤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容