1. 程式人生 > >android @id和@+id的區別

android @id和@+id的區別

今天,簡單講講android裡關於@id和@+id的區別。

之前,自己在佈局裡無論什麼情況都使用@+id,可是後來發現有些程式碼用的是@id,自己不知道這兩者之間有什麼區別。於是就在網上查詢資料,最終是解決了問題。這裡記錄一下。

Android中的元件需要用一個int型別的值來表示,這個值也就是元件標籤中的id屬性值。id屬性只能接受資源型別的值,也就是必須以@開頭的值,例如,@id/abc、@+id/xyz等。
如果在@後面使用“+”,表示當修改完某個佈局檔案並儲存後,系統會自動在R.java檔案中生成相應的int型別變數。變數名就是“/”後面的值,例如,@+id/xyz會在R.java檔案中生成int xyz = value,其中value是一個十六進位制的數。如果xyz在R.java中已經存在同名的變數,就不再生成新的變數,而該元件會使用這個已存在的變數的值。


也就是說,如果使用@+id/name形式,當R.java中存在名為name變數時,則該元件會使用該變數的值作為標識。如果不存在該變數,則新增一個新的變數,併為該變數賦相應的值(不會重複)。
    既然元件的id屬性是一個資源id就可以,那麼自然可以設定任何已經存在的資源id值,例如,@drawable/icon、@string/ok、@+string/you等。當然,也可以設定android系統中已存在的資源id,例如,樓主提出的@id/android:list,那麼這個android是什麼意思呢,實際上,這個android就是系統的R類(在R.java檔案中)所在的package。我們可以在Java程式碼編輯區輸入android.R.id.,就會列出相應的資源id,例如,也可以設定id屬性值為@id/android:message。

<ListView android:id="@+id/android:message"
   android:layout_width="wrap_content"
      android:layout_height="wrap_content"/>
還有另外一種方法檢視系統中定義的id,進入<android sdk安裝目錄>\platforms\android-1.5\data\res\values目錄,找到ids.xml檔案,開啟後,內容如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="id" name="price_edit">false</item>

<item type="id" name="amount_edit">false</item>
</resources>

若在ids.xml中定義了ID,則在layout中可如下定義@id/price_edit,否則@+id/price_edit

這裡簡單講講,其實@+id就是在R.java檔案裡新增一個id名稱,如果之前已經存在相同的id名稱,那麼會覆蓋之前的名稱。而@id則是直接引用R.java檔案的存在的id資源,如果不存在,會編譯報錯。

用一個例子來講:

<View
    android:layout_below="@+id/view1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

<View
    android:id="@id/view1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

上述程式碼是正確的,即下面的順序是被允許的。但是去掉第一行的+號,或者將第二行與第一行的位置換一下,便不行!!!

android:layout_below="@+id/view1"
android:id="@id/view1"

原理就是:
@+id會在R.java file裡面新增一個新的id,這也就是能用findViewById(R.id.xxx)找到控制元件的原因,而@id就直接在這個檔案裡查找了。

而為什麼已經存在了某個id,在layout_below裡仍可以@+id呢?
因為android能容忍重複的id存在,並不是說會出現兩個相同的id,而是新的id覆蓋原有的id,而在這兒@+id不過是將id重複建立了一遍。

不建議在已存在某id的時候再在佈局中使用@+id,雖然暫時這是被允許的,但是這種寫法並不規範,在後續的android版本中可能被禁止這種寫法。

簡單講講,其實在相對佈局裡,除了申明控制元件的id使用@+id/外,其餘的引用控制元件最好使用@id,這樣符合程式碼規範,也可以節約編譯的時間,避免R.java檔案無用的寫入。



相關推薦

Android @id@+id區別

文件 int 十六進制 存在 變量 android中 target r.java文件 需要   Android中的組件需要用一個int類型的id屬性值來表示。id屬性只能接受資源類型的值,也就是必須以@開頭的值,例如,@id/abc、@+id/xyz等。如果在@後面使用“+

Android查缺補漏(View篇)--布局文件中的“@+id“@id”有什麽區別

新增 布局 parent 直接 使用 margin 移除 控件 Coding Android布局文件中的“@+id”和“@id”有什麽區別? +id表示為控件指定一個id(新增一個id),如: <cn.codingblock.view.customer_view.

android @id@+id區別

今天,簡單講講android裡關於@id和@+id的區別。之前,自己在佈局裡無論什麼情況都使用@+id,可是後來發現有些程式碼用的是@id,自己不知道這兩者之間有什麼區別。於是就在網上查詢資料,最終是解決了問題。這裡記錄一下。Android中的元件需要用一個int型別的值來表

data-id id區別

作者:Zeropoint零點 來源:CSDN 原文:https://blog.csdn.net/qq_41648132/article/details/80364335 版權宣告:本文為Zeropoint零點原創文章,轉載請附上博文連結!   id是選擇器data-id只是行記憶體放資料的一個標

獲取元素的idid賦值

通過事件響應函式,獲取id的值,並且把id的值賦值給另一個元素 <input id='btnSelect"+index+"' type='button' onclick='getSupplier(this)' value='請選擇'> function getSupplier(o

Android SleepWait區別

1、這兩個方法來自不同的類,sleep來自Thread類,wait 來自Object類。   sleep是Thread的靜態類方法,誰呼叫的誰去睡覺,即使是在a執行緒離呼叫了b的sleep方法,實際上還是a 去睡覺,要讓b去睡覺要在b的程式碼中呼叫sleep. 2、最主要

Android ServiceIntentService區別及知識點詳細總結

Service 對於廣大的Android開發者來說算是耳熟能詳了,作為Android的四大元件之一,在我們的開發中也起著重要的作用,在Android面試中,Service相關的問題也是面試官問得比較多的,當別人問你,Service 到底是什麼的時候?你可能隨口就能答得上來,

idclass的區別

xhtml 特殊符號 好的 web 沒有 定義 開頭 數字 推薦 id和class沒有本質上的區別,很多時候可以混用(XHTML不允許,但是也不會報錯)。但符合web標準的頁面必須結構良好,有語義,有可讀性,所以為了養成良好的代碼編寫習慣,建議讀者嚴格區分。同樣的i

Windows中句柄ID區別

程序員 之間 spa nload 資源 das 語句 導致 arr VC++菜單的句柄也可以理解成菜單的識別符(ID). 但如果指菜單項的ID, 那可能又是一回事了。按我的理解: 1. 句柄是程序運行中系統為其分配的,菜單項ID是編程者自己定義指定的。一般可在資源文件中定

Python中的is==的區別,is判斷值是否相等,id判斷地址是否一致

copy 就是 是否一致 val 類型 對象 包含 () true Python中的is和==的區別 Python中的對象包含三要素:id、type、value。 其中id用來唯一標示一個對象,type標識對象的類型,value是對象的值。 is判斷的是a對象是否就是b對象

spring中的Bean的idname的區別

spring中的Bean的id和name的區別 2017年10月01日 18:23:59 冰河家園 閱讀數:296 標籤: spring 更多 個人分類: spring Spring中Bean的命名 1、每個Bean可以有一個id屬性,並可以根據該id在IoC容器中查詢該Bean

MVC中@Html.DisplayFor(p=>p.Id) @Model.Id區別

    在MVC中,在Controllers查詢到資料,返回一個實體給View並顯示,可以用@Html.DisplayFor(p=>p.Id)和 @Model.Id這兩種方式顯示某個欄位資料(如Id),但是,這兩者是用區別的,即如果Controllers中沒有查詢到資料,則

IDClass有什麼區別

這裡是修真院前端小課堂,每篇分享文從 【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】 八個方面深度解析前端知識/技能,本篇分享的是: 【ID和Class有什麼區別?】   一、背景介紹 HTML頁面中的元

【Html】在表單(input)中idname的區別

但是name在以下用途是不能替代的: 1. 表單(form)的控制元件名,提交的資料都用控制元件的name而不是id來控制。因為有許多name會同時對應多個控制元件,比如checkbox和radio,而id必須是全文件中唯一的。此外瀏覽器會根據name來設定傳送到伺服器的r

獲取IOC容器中的bean的兩種方式(idclass)的區別

// ClassPathXmlApplicationContext: 是 ApplicationContext的實現類,從類路徑下來載入配置檔案 ApplicationContext ctx=new ClassPathXmlApplicationContext("a

html中classid區別

class用來宣告類別, 主要是指向css表中的類,可以給html元素賦予多個class, 例如: <html> <head> <style type="text/css"> h1.intro { color:blue;

CSS選擇器:#id.class中間有空格無空格的區別

相信大家都知道 .class1 .class2 和 .class1.class2 是兩種不同的選擇規則,但具體怎樣不同呢? 首先中間有空格的情況:是選擇到.class1類下的.class2類子節點,即.class2類的節點要是.class1類子節點 .class1 { col

元素選擇器 #id 選擇器 以及 .class 選擇器三者的區別

jQuery 選擇器允許您對 HTML 元素組或單個元素進行操作,jQuery 選擇器基於元素的 id、類、型別、屬性、屬性值等”查詢”(或選擇)HTML 元素。 它基於已經存在的 CSS 選擇器,除此之外,它還有一些自定義的選擇器。jQuery 中所有選擇器都

Spring配置檔案定義類時用idname的區別

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3

Session ID/session token 及cookie區別

cookie機制採用的是在客戶端保持狀態的方案。它是在使用者端的會話狀態的存貯機制,他需要使用者開啟客戶端的cookie支援。cookie的作用就是為了解決http協議無狀態的缺陷所作的努力.而session機制採用的是一種在客戶端與伺服器之間保持狀態的解決方案 。同時