2013-10-23 43 views
8

我知道@+id@id之間的區別(請參閱此accepted answer)。但是,當我在@+id中編寫'+'時,我總是感覺到我正在執行AAPT編譯器的工作。爲什麼需要使用@ + id而不是@id?

是否有一個原因,如果必須創建一個標識符或只是重複使用資源編譯器本身並不能推斷?一個潛在的hashtable結構可以完成這項工作:每個具有相同id的資源進入同一個桶,如果該鍵不存在,就創建它。

+0

http://stackoverflow.com/questions/5025910/difference-between-id-and-id-in-android - 請參考 – N20084753

+0

@ N20084753他已經在OP中提到過它。 – Piovezan

+0

@ N20084753這是我在第一句話中給出的鏈接。它解釋了差異,但沒有回答爲什麼'+'不能被AAPT自動傳送。 –

回答

0

與@ + ID要添加ID到R.java,它允許您從Java類中引用它,而與@id你不是。只有在已經創建了特定ID並且您正在另一個視圖中引用它時,纔可以使用@id,例如android:layout_below="@id/some_id"

+1

謝謝,但正如我所說,我知道所有這一切。問題是爲什麼加號是必要的。編譯器應該很容易知道標識符是否已經存在,所以我不明白爲什麼我必須給它這個信息。 –

1

也許編譯器將無法一個「正確」和「錯誤」的ID來區分。如果它找到一個新的id(即不在底層哈希表中),它總是會認爲它是一個正確的新id。它無法區分實際的新ID和打錯的ID。

+0

也許,但結果是許多開發人員在任何地方都使用@ + id,因爲如果已經定義了id,則沒有錯誤,並且一切正常。這意味着編譯器會測試這個id是否已經存在,但如果它不存在的話,那就太瘋狂了。 –

1

我可以想象它是幫助程序員。

如果你不需要@ + id構造,那麼所有的@id引用/結構將是有效的,那麼很難追蹤到錯誤,因爲編譯器不會在不正確的引用上失敗(因爲它會簡單構造錯字ID)。

換句話說,所有id引用錯誤都必須在運行時發現。

編輯:

只注意到由Piovezan了類似的答案,關於你的評論:

Maybe, but the result is that many devs use @+id everywhere, since there is no error if the id is already defined, and everything works just fine. That means the compiler tests if the id already exist, but not if it does not exist, that's crazy 

那麼那些開發商都IMO濫用@ + ID建設。因爲(對於那些沒有誤用@ + id的編譯器)編譯器有可能在錯誤的引用上給出編譯時錯誤,所以選擇區分@ + id和@id仍然好得多。

EDIT2

並解決了評論:

That's the link I gave in the first sentence. It explains the difference but does not answer why the '+' cannot be automatically infered by AAPT 

我認爲是可以的,它只是不因上述論證(我相信)。

+0

這樣做的目的是幫助開發者的確是一種可能性。但是,嘗試在eclipse設計器中拖放一些UI元素,就會發現它使用@ + id EVERYWHERE!由於它是一個官方的Android工具,我發現這種行爲很奇怪,因爲大多數新用戶都會使用該設計器,並查看要學習的代碼。 –

+0

我可以看到你的觀點,但因爲它是一個工具,所以它肯定會生成有效的引用,並且可能有理由使用@ + id(我猜它們更簡單)。底線,他們不需要@id帶來的編譯時幫助。 – cYrixmorten

相關問題