2012-05-04 8 views
45

Ho un progetto Android con più target di compilazione (utilizzando formica). A scopo di test, gli obiettivi di compilazione hanno tutti nomi di pacchetti diversi (quindi il mio nome del pacchetto è com.mycompany.myapp per build release e com.mycompany.myapp.test per build test).Dichiarazione dello spazio dei nomi Xml: nome del pacchetto sostitutivo automatico

Questo funziona bene per la maggior parte, tranne quando si tratta di spazi dei nomi xml personalizzati nei file di layout. Quindi questo:

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

smetterà di funzionare non appena nome del pacchetto viene sostituito con com.mycompany.myapp.test.
Per questo motivo, devo sostituire il valore com.mycompany.myapp ogni volta durante la pre-costruzione. E dal momento che tutti questi file devono essere in VCS, e non devono essere in conflitto ogni volta che una persona passa di configurazione e li fonde, ho dovuto spostare i file di layout nella cartella config specifica, dove si sarebbe simile:

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

Ora questo i file sono memorizzati in vcs e @ CONFIG.PACKAGENAME @ viene sostituito durante la precostruzione e quindi il file viene copiato da ./config/file.xml in ./res/layout/file.xml.

Questo è estremamente incoerente e non è in grado di scalare correttamente (non riesco a immaginare di menzionare ognuno di 50 file simili nello script di build).

Quindi la mia domanda è: esiste un modo per utilizzare automaticamente il nome del pacchetto corrente nella dichiarazione dello spazio dei nomi? O almeno modifichiamo i file di layout (o costruisci i file?) In modo che non debba sostituire com.mycompany.myapp ogni volta che cambio il nome del pacchetto.

risposta

115

Si scopre che esiste un suffisso per questo: res-auto.

Quindi tutto quello che dovete fare è scrivere

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

Questo userà automaticamente il nome del pacchetto corrente.

+1

Riferimento: http://developer.android.com/tools/sdk/eclipse-adt.html (sezione ADT 17.0.0). – Pang

+0

"Aggiunto il supporto per le visualizzazioni personalizzate con gli attributi personalizzati nelle librerie.I layout che utilizzano attributi personalizzati devono utilizzare l'URI dello spazio dei nomi http://schemas.android.com/apk/res-auto anziché l'URI che include il nome del pacchetto dell'app. viene sostituito con l'app specifica al momento della compilazione. " – flup

+2

Funzionerà anche se il mio progetto utilizza una libreria che contiene visualizzazioni personalizzate? –

Problemi correlati