2010-09-15 14 views
8

Vorrei sapere se c'è un modo per inserire/iniettare un elemento <string> definito in un file XML in un altro elemento <string>, facendo ciò solo con XML.Android: come iniettare un elemento <string> in un altro elemento <string> in XML?

Per esempio avrei potuto avere:

<string name="author">Francesco</string>` 

e sto cercando qualcosa di simile:

<string name="about_application">Author: @string/author</string>` 

in modo che getString(R.string.about_application) si tradurrebbe in "Autore: Francesco".

So che avrei potuto combinare i due elementi nel codice Java utilizzando String.format(string, formatArgs) come ad esempio:

<string name="author">Francesco</string> 
<string name="about_application">Author: %1$s</string>` 

e allora in uso codice

String.format(getString(R.string.about_application), getString(R.string.author)) 

ma mi piacerebbe farlo in XML direttamente.

Qualcuno può suggerirmi un modo per farlo?

risposta

14

Se ho capito cosa stai cercando di fare, allora internal (parsed) general entities potrebbe aiutarti a ottenere quello che stai cercando.

Un esempio di come si può definire il valore "Francesco", come un'entità chiamata "auth" e poi utilizzarlo nella vostra XML:

<?xml version="1.0"?> 
<!DOCTYPE doc [ 
    <!ENTITY auth "Francesco"> 
]> 
<doc> 
    <string name="author">&auth;</string> 
    <string name="about_application">Author: &auth;</string> 
</doc> 

quando viene letto da un parser XML, il documento sarà analizzato e valutati, o "visto", come:

<?xml version="1.0"?> 
<doc> 
    <string name="author">Francesco</string> 
    <string name="about_application">Author: Francesco</string> 
</doc> 
+0

Grazie! Funziona bene quando faccio riferimento a un'entità interna da un elemento xml nello stesso file, mentre ho problemi a fare riferimento a un'entità esterna definita in un altro file xml. Ad ogni modo, non sono sicuro che questo tipo di meccanismo debba essere usato con i file Android/res/values ​​/ xml, penso che sia un po 'lontano dal modo "standard" di Android per gestirli. –

+2

Questo è come un indirezione sopra l'indecisione :-). Il problema potrebbe essere che quando si esegue la conversione di string.xml (copie in altre cartelle), si dimentica di localizzare &auth;. Inoltre, ogni traduzione ha ancora bisogno di tutti i tag delle stringhe contenenti &auth;. Ma sì, questo è il migliore possibile perché deve essere statico (quindi i file xml possono essere resi binari). – pjv

1

Purtroppo non penso sia possibile. Ho chiesto un similar question qualche tempo fa, e mi è stato detto che non era possibile.

+0

Grazie comunque! In realtà penso anche che non ci sia un modo standard per farlo, anche se il "trucco" proposto da Mads Hansen potesse fare il lavoro. –

0

Gradle plug 0.10 porta quello che chiamano manifestPlaceholders che fa sostanzialmente quello che ti serve, ma questa funzione al momento solo il lavoro nella AndroidManifest. C'è anche se an issue opened targeting the next Android build version 1.4 (1.3 è attualmente in beta4 quindi dovrebbe essere vicino RC1 e potrebbe vedere un 1.4 beta1 presto si spera).

Questo problema dovrebbe espandere i segnaposto nei file di configurazione xml (, prego solo che questo includa il file di stringhe e non solo la configurazione xml di base).

Da: http://tools.android.com/tech-docs/new-build-system

Per i segnaposto personalizzati sostituzioni, utilizzare il seguente DSL per configurare i valori segnaposto:

android { 
     defaultConfig { 
      manifestPlaceholders = [ activityLabel:"defaultName"] 
     } 
     productFlavors { 
      free { 
      } 
      pro { 
       manifestPlaceholders = [ activityLabel:"proName" ] 
      } 
     } 

sostituirà il segnaposto nella seguente dichiarazione :

<activity android:name=".MainActivity"> android:label="${activityLabel}" >

Non vedo l'ora di provarlo. In questo modo è possibile inserire un segnaposto in più occorrenze nel file di stringhe e definire il valore solo in un posto invece di modificare tutti i file java per aggiungere un argomento con% 1 $ s

Per ora l'unica soluzione pulita è sebbene il trucco dell'entità ma questo non funzionerà se si vuole sovrascrivere il valore in aromi poiché l'entità deve essere definita nello stesso file xml.

Problemi correlati