2013-04-14 36 views
2

我遇到了一個問題,讓我意識到有一個核心概念我沒有得到。 由於某些原因,當我去爲我的strings.xml文件添加一個值時,發生了一些情況,並且我的xml文件給出瞭解析錯誤。我能夠解決這個問題的唯一方法是刪除字符串文件並通過右鍵單擊values文件夾並重新創建它,然後選擇「添加android xml文件」並將其命名爲strings.xml。 這使錯誤消失,但現在,我的活動抱怨並說他們無法解決R(如R.id)。Java資源背後的概念,引人注目的gs,「R.id」

這使得好奇R和xml文件之間的關係是什麼。爲什麼當你引用一個字符串時,你使用@String/something,當它包含它的文件被稱爲strings

最後爲什麼即使我創建了一個名爲strings.xml的xml文件,在正確的位置,我的項目沒有將他的文件看作是strings.xml文件?

+0

R.java是在您自己或eclipse編譯您的項目時生成的。 – StarPinkER

+0

通常情況下,清理並重建項目將修復它。 – pierrotlefou

回答

2

名稱

將R資源以特定的方式組織:

  • R.layout.* - 這些資源是你的佈局文件,你已經在各種layout-*文件夾
  • R.menu.*創建 - 這些資源是您的菜單文件,在您的各種menu-*文件夾中創建。
  • R.id.* - 這些是您的各種視圖和菜單項等資源標識符。可以有多個具有相同ID的元素,只要它們在單獨的文件中。
  • R.string.* - 這些是您的字符串資源,在values-*文件夾中的文件中的<string>元素中聲明。文件名是無關緊要的。一個文件夾中只能有一個具有特定名稱的字符串元素。所以在values中不能有兩個hello字符串,但在valuesvalues-en中可以各有一個。
  • R.drawable.* - 這些是您在drawable-*文件夾中的各種XML和圖像可繪圖。

還有很多,但這些是最常見的。當我有更多時間在我手上時,我會補充剩下的。

編譯

在編譯後,Android編譯系統將所有的XML文件轉換爲二進制格式。除了/res/raw之外的所有內容都會被壓縮。這對佈局特別有幫助,佈局可以在壓縮後更快地膨脹。編譯後個別文件不復存在,並且所有內容都成爲一個大的二進制文件。您可以從XML

命名

對於某些資源(可繪製,佈局,菜單)的文件名事宜訪問使用R.<resource_type>.<name>從Java和@<resource_type>/<name>這個文件中的數據,作爲資源被稱爲使用。對於其他資源(字符串,顏色,樣式),只要在文件中聲明文件時使用正確的元素(例如字符串爲<string>),則文件名無關緊要。

1

當你的項目被編譯並建,一出現這種情況的事情是R文件的生成。每個指定的資源都有一個public static final int標識符,如R.string.foo,它將引用一個用name="foo"定義的字符串。通過這種方式,您可以引用Java中的資源,Android會將其映射到資源並從您的應用程序包中加載它。

資源可能過載;您可以使用兩個名爲foo的字符串,它們可以用於不同的配置,但它們在R類中具有相同的標識符。系統將在運行時選擇與設備配置最匹配的設備。

如果您的任何資源聲明出現錯誤,R將無法​​生成,並且任何引用它的java類都會因此抱怨它。您可以在Eclipse中執行Project> Clean並查看是否有幫助,但否則請確保您的資源已正確聲明和/或具有有效名稱。

+0

謝謝。我還想知道,@符號的意義是什麼wxml文件,即@ + id/textView1,除了「id」之外還有什麼可以遵循的? – Siavash