2012-05-04 144 views
45

我有一個帶有多個構建目標(使用ant)的android項目。出於測試目的,這些構建目標都具有不同的軟件包名稱(所以我的軟件包名稱是發佈版本的com.mycompany.myapp,測試版本是com.mycompany.myapp.test)。Xml名稱空間聲明:自動替換包名稱

除了當涉及到佈局文件中的自定義xml命名空間時,這在大多數情況下都能很好地工作。 所以這個:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:custom="http://schemas.android.com/apk/res/com.mycompany.myapp" /> 

將停止作爲包名被替換com.mycompany.myapp.test儘快工作。
因此,我必須在預編譯期間每次替換com.mycompany.myapp值。而且,由於所有這些文件都應該在風險投資,並且應該不會衝突,每次一個人交換機配置並將它們合併,我只好佈局文件移動到特定的config文件夾,在那裏他們將看起來像:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:custom="http://schemas.android.com/apk/res/@[email protected]" /> 

現在這文件存儲在vcs中,@ CONFIG.PACKAGENAME @在預建期間被替換,然後將文件從./config/file.xml複製到./res/layout/file.xml。

這是非常不方便的,並且不能很好地擴展(我無法想象在構建腳本中提到每個像50個文件)。

所以我的問題是:有沒有辦法在名稱空間聲明中自動使用當前包名?或者至少是修改佈局文件(或構建文件?),這樣我就不必在每次更改包名稱時都替換com.mycompany.myapp。

回答

115

原來這裏有一個後綴:res-auto。

因此,所有你需要做的是寫

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:custom="http://schemas.android.com/apk/res-auto" /> 

這將自動使用當前的包名。

+1

參考:http://developer.android.com/tools/sdk/eclipse-adt.html(ADT 17.0.0部分)。 – Pang

+0

「增加了對庫中自定義屬性的自定義視圖的支持,使用自定義屬性的佈局必須使用名稱空間URI http://schemas.android.com/apk/res-auto而不是包含應用程序包名稱的URI。在構建時替換爲特定應用程序。「 – flup

+2

即使我的項目使用保存自定義視圖的庫,它也可以工作嗎? –