2012-05-04 2 views
45

У меня есть проект андроида с несколькими целями построения (с использованием муравья). Для целей тестирования у всех создаваемых целей есть разные имена пакетов (поэтому мое имя пакета - 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 каждый раз во время предварительной сборки. А поскольку все эти файлы должны быть в VCS, и не должны конфликтовать каждый раз, когда один человек переключает конфигурацию и их объединяют, я должен был переместить макет файлов в конкретную папку конфигурации, где они будут выглядеть как:

<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 файлов в скрипте сборки).

Итак, мой вопрос: есть ли способ автоматически использовать текущее имя пакета в объявлении пространства имен? Или, по крайней мере, файлы макета modife (или файлы сборки?), Так что мне не придется заменять 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

Будет ли работать, даже если мой проект использует библиотеку, которая содержит пользовательские представления? –

Смежные вопросы