成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

閑談Android中的@和?符號的引用區別

移動開發 Android
在 Android 項目開發中,我們經常會用 “@” 或者 “?” 符號去引用系統或者我們應用內添加的資源,這兩種符號的引用有什么區別呢,“?attr/” 與 “?android:attr/” 之間又有怎樣的不同呢?本文我們不妨閑聊一下。

[[185974]]

在 Android 項目開發中,我們經常會用 “@” 或者 “?” 符號去引用系統或者我們應用內添加的資源,這兩種符號的引用有什么區別呢,“?attr/” 與 “?android:attr/” 之間又有怎樣的不同呢?本文我們不妨閑聊一下。

“@” 與 “?” 符號的引用在使用時都有一個規范的格式:"@[+][package:]type:name","?[package:][type:]name"。可以看到,二者均包含引用符號、資源所屬的包、資源類型和資源名稱。

@ 資源引用

“@” 符號用于引用系統和我們在項目中添加的一些固有資源(drawable,string 等),或者定義的 style 樣式。比如:

  1. android:text="@string/app_name" 

這里的 app_name 就是我們自己定義在項目文件 values/strings.xml 中的字符串資源。

  1. android:text="@android:string/cancel" 

而這里的 cancel 屬于 Android SDK 中的系統字符串資源,所以需要添加@android: 來指明引用來源。android: 是 package: 的一個具體實例。

? 屬性引用

“?” 符號用于引用當前主題中定義的一些屬性值。注意,“?” 符號通過屬性名字間接引用當前主題中的對應屬性值,而不是屬性本身。舉個例子:

  1. android:divider="?android:listDivider" 

這里的 “?” 符號通過屬性名 android:listDivider 間接獲取當前主題賦予該屬性的值。如同 @android: 一般,?android: 表示該值源自 Android SDK 系統屬性。由于在當前主題中尋找對應屬性名的值,所以沒有指定屬性類型,其實等同于:?android:attr/listDivider。

那如何引用項目中自定義的屬性呢?我們在 attrs.xml 中定義一個屬性,如:

  1. <declare-styleable name="CustomTextView"
  2.     <attr name="colorTextCustom" format="reference|color"/> 
  3. </declare-styleable> 

顯然,此時我們定義的 colorTextCustom 屬性是沒有值的,直接引用沒有任何作用。需要在主題 style 中賦值:

  1. <style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar"
  2.     <item name="colorTextCustom">#FF0000</item> 
  3. </style> 
  4.  
  5. <style name="AppTheme" parent="BaseTheme"
  6.     <item name="android:textColor">?colorTextCustom</item> 
  7. </style> 

可以看到,這里在 BaseTheme 中對 colorTextCustom 屬性賦值,并在 AppTheme 中通過 “?colorTextCustom” 引用該屬性值。由于是本地項目中定義的屬性,所以沒有添加 android: 命名空間。其實,這種做法的好處是,AppTheme 所覆蓋的 View 均可通過構造函數獲取當前主題中的 colorTextCustom 屬性值。

R.attr & R.style

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

這里舉幾個常用的:

style="?android:attr/borderlessButtonStyle"

Android 5.0 默認 Button 的樣式自帶邊框陰影,可以使用這個系統樣式去除該樣式。當然,這是單獨設置時的操作,為了方便全局控制,可以在 styles.xml 中自定義一個樣式,繼承一個無邊框樣式作為 parent:

  1. <style name="CustomBorderlessButtonStyle" parent="@style/Widget.AppCompat.Button.Borderless"
  2.     <item name="android:textColor">@android:color/white</item> 
  3.     ... 
  4. </style> 

android:background="?android:attr/selectableItemBackground"

可用于設置一些 List Item、Button之類帶點擊效果的背景。該樣式自帶觸摸點擊效果,在 5.0 和更高版本上,更是附有 Ripple 漣漪效果,省去我們自己實現 selector 選擇器的過程。當然我們也可以自己使用 <ripple> 標簽定義一個 drawable 文件實現漣漪效果,只是需要注意版本限制。

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

實現分割線背景。

還有一些其他有用的系統資源,這里就不一一列舉了...

責任編輯:龐桂玉 來源: Android技術之家
相關推薦

2024-12-16 16:10:31

2011-07-11 14:36:05

JAVA

2010-09-13 16:38:53

CSSlink@import

2023-10-12 08:25:18

Javaequals內存

2021-08-04 08:33:59

TypeScriptConst Readonly

2021-10-18 15:50:49

Android強引用軟引用

2009-11-25 09:23:47

PHP引用&符號

2010-08-30 10:32:38

SPANDIV

2010-09-08 09:33:09

CSSlink@import

2015-08-10 10:58:53

dompropertyattribute

2010-09-01 15:11:09

linkimportCSS

2012-03-01 14:04:03

Java

2011-04-20 09:07:44

Ubuntuuseraddadduser

2016-12-06 10:30:39

JavaScriptWriteWriteln

2009-06-29 18:32:30

Hibernate

2011-05-19 17:41:20

SenderSelf

2024-03-19 14:41:08

C#操作符開發

2021-04-13 07:51:24

JavaScript引用傳遞

2017-02-27 08:34:09

JavaScript數據引用

2010-07-26 13:13:33

Perl函數參數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久黄网 | 久久精品一二三影院 | 精品av天堂毛片久久久借种 | 国产综合精品一区二区三区 | 国产福利91精品 | 日韩免费一区 | 九色综合网 | 天天想天天干 | 中国一级大毛片 | 91五月婷蜜桃综合 | 日韩中文字幕在线 | 就操在线 | 久久亚洲综合 | 色成人免费网站 | 综合久久久久久久 | 亚洲一区自拍 | 一区二区三区回区在观看免费视频 | 久久精品国产亚洲一区二区 | 欧洲av一区 | 久久九九免费 | 99久久婷婷国产综合精品电影 | 欧美日日 | 久久一区二区av | 色视频成人在线观看免 | 成人免费毛片片v | 韩日在线观看视频 | 一级毛片免费完整视频 | 日韩中文字幕一区二区三区 | 国产视频一区二区在线观看 | 亚洲成人av | 99reav| www.中文字幕.com | 亚洲一区二区三区视频 | av在线一区二区三区 | 91在线看| 国产一区二区视频在线 | 欧美精品久久久久 | 欧美精品一区二区三区蜜桃视频 | 国产精品亚洲精品 | 中文字幕一级 | 91av导航|