轉:android專案中values中幾個檔案的作用
最近反編譯了幾個Android軟體,發現一些以前未用到的資原始檔:
ids.xml——為應用的相關資源提供唯一的資源id。id是為了獲得xml中的物件而需要的引數,也就是Object = findViewById(R.id.id_name)中的id_name。這些值可以在程式碼中用android.R.id引用到。
若在ids.xml中定義了ID,則在layout中可如下定義@id/price_edit,否則@+id/price_edit。
為什麼使用ids?
我個人認為有以下幾點作用:
(1)優化編譯效率。
我們知道android的元件必須用一個int型別的id屬性來標識其唯一性,id屬性必須以@開頭的值,例如,@id/abc、@+id/xyz等。
如果使用"@+id/name"形式,當R.java中存在名為name變數時,則該元件會使用該變數的值作為標識。如果不存在該變數,則新增一個新的變數,併為該變數賦相應的值(不會重複)。
當修改完某個佈局檔案並保存後,系統會自動在R.java檔案中生成相應的int型別變數。變數名就是“/”後面的值,例如,@+id/xyz會在R.java檔案中生成int xyz = value,其中value是一個十六進位制的數。如果xyz在R.java中已經存在同名的變數,就不再生成新的變數,而該元件會使用這個已存在的變數的值。
使用@id/name形式,預先定義的id已經生成,修改配置檔案時,也不會引起系統重新生成。
(2)統一管理資源Id。
public.xml——描述的是為attr、id、drawable所指定的一個32的id值,這個值在current.xml檔案中會被用到。
當我們對public.xml做了改動後,執行make update-api命令,相應的current.xml就會新增這些改動。
在public.xml中資源資料的定義會影響到current.xml檔案,它們分別在frameworks/asecoreesesvalues和framework/aseapicurrent.xml中。
當進行核心檔案修改時,需要特別注意public.xml檔案的同步,該文件定義了資原始檔的二進位制相容性。因此需要小心對待該檔案,否則可能會破壞該版本的向後相容性。
為了避免破壞相容性,新的資源需加在同類資源的最後(主要ID值,按照ID值遞增)。若是放置在中間會導致隨後的同類資源被賦予新的ID值從而破壞相容性。
新增id的方法:
1)在ids.xml中新增公共id項,在public.xml中也新增相應的id項。這種辦法沒有相容性,會與後面的版本產生衝突。
2)在ids.xml中新增公共id項,每一項前面加一行<!– @hide –>的註釋,這樣就不用在public.xml中新增相應的項了。原始碼中是的形式,這樣current中就不會有相應的段了。
3)在自己寫的xml中,使用android:id = “@+id/id_name”的形式,就和在eclipse中一樣,搜一下會發現android原始碼中也有這麼用的,這樣ids.xml和public.xml都不用改,相容性我還不確定。
其它常用的資原始檔:
attrs.xml——當中定義的是類的屬性,屬性是為了能在xml檔案中被引用到,換句話說就是指定類中變數(也就是屬性的實際作用者)的值。這些屬性會在類的建構函式中用到。看過一兩個原始碼就會明白,建構函式中的TypedArray其實就是屬性的陣列,陣列的成員會被賦給類裡的成員,完成從xml的初始化。類的建構函式一般有三個,一個是Class(context),這個用於在程式碼中建立一個類,所以只包含一個上下文;Class(context, attrs)和Class(context, attrs, defStyle)用於從xml建立類的情況。
styles.xml——當中是各個控制元件的“樣式”,樣式由一個個屬性所組成。我們在編輯xml檔案的時候,不同的類所能設定的屬性有共同的,也有不同的,都是由樣式來控制的。具體可以去看styles.xml這個檔案的內容。
themes.xml其實也是樣式,只是適用的範圍大一點,這個我是參考網上別人的看法,自己還沒研究過。
colors.xml——當中定義各種顏色值。
strings.xml——當中定義使用到的字串常量。