2013-03-21 3 views
7

Per riferimento stringa pippo a strings.xml (in valori \ res) di un progetto di app, si può semplicemente utilizzareCome fare riferimento a una stringa in stringhe.xml di una libreria Android nel codice?

getString(R.string.foo) 

getString è un metodo di contesto.

Supponiamo che una libreria Android abbia una stringa foo nel suo strings.xml. Come può essere usato in un metodo della biblioteca?

Modificato: È stato suggerito di passare un riferimento di Context al metodo della libreria in modo da poter utilizzare getString(). Poiché si tratta di un contesto di un progetto di app, esiste un potenziale conflitto che può essere illustrato come segue:

Supponiamo: La libreria ha una stringa foo con value = "libreria foo". Un progetto app ha un foo stringa con value = "app foo"

il seguente codice

Log.d("Debug", "App foo ID: " + R.string.foo); 
Log.d("Debug", "App: foo value: " + getString(R.string.foo)); 

genera:

03-22 05:53:55.590: D/Debug(16719): App foo ID: 2131230723 
03-22 05:53:55.590: D/Debug(16719): App foo value: app foo 

In un metodo biblioteca, il seguente codice

Log.d("Debug", "Library foo ID: " + R.string.foo); 
Log.d("Debug", "Library foo value: " + context.getString(com.my.library.R.string.foo)); 

genera:

03-22 05:55:03.680: D/Debug(16719): Library foo ID: 2131230723 
03-22 05:55:03.680: D/Debug(16719): Library foo value: app foo 

Quanto sopra mostra il conflitto di ID quindi valore di stringa errato.

risposta

7

Come indicato per fare riferimento a una risorsa stringa definita nella libreria, è possibile utilizzare il metodo getString(), è necessario solo un contesto, ma nell'esempio il conflitto è generato dallo stesso nome delle stringhe.

Quando si definisce una risorsa nella libreria, si verifica un conflitto se si utilizza lo stesso nome di una risorsa nel modulo dell'applicazione. Per evitare conflitti è necessario utilizzare nomi univoci, ad esempio utilizzando un prefisso comune per i nomi di risorse nella libreria, non è sufficiente il nome del pacchetto diverso.

Per risolvere è possibile utilizzare i seguenti nomi:

  • mylib_foo nella libreria
  • foo nell'applicazione

Fonte dalla documentazione Android: http://developer.android.com/tools/projects/index.html#considerations

Come si sviluppa i moduli di libreria e applicazioni dipendenti, mantenere i seguenti punti in mente:

  • risorse in conflitto

    Poiché gli strumenti si fondono le risorse di un modulo di libreria con quelle di un'applicazione dipendente modulo, un dato ID risorsa potrebbe essere definito in entrambi i moduli. In questo caso, gli strumenti selezionano la risorsa dall'applicazione o la libreria con la priorità più alta e scarta l'altra risorsa. Durante lo sviluppo delle applicazioni, tenere presente che è probabile che gli ID delle risorse comuni vengano definiti in più di un progetto e che vengano uniti, con la risorsa dall'applicazione o la libreria con priorità più alta .

  • Utilizzare i prefissi per evitare conflitti di risorse

    Per evitare conflitti di risorse per gli ID risorsa comune, considerare l'utilizzo di un prefisso o un altro schema di denominazione coerente che è unico al modulo (o è univoco in tutti i moduli del progetto) .

4

Un progetto di libreria dovrebbe essere in grado di fare riferimento alle risorse nello stesso modo.

Esiste un caso/codice di esempio specifico che illustra questo non funziona?

Qualsiasi stringa definita nel progetto principale sovrascriverà la libreria. Anche actionbarsherlock usa un prefisso es. abs__action_bar_home_description

+1

Il metodo non ha un riferimento al contesto, come può getString() utilizzabile? – Hong

+0

L'unico modo è con un contesto. Di solito ho appena impostato il mio metodo per accettare un contesto dall'applicazione chiamante. – DDRBoxman

+1

devi passare un parametro 'Context' al tuo metodo. Nota che 'View' ha un metodo' getContext() ', se hai già un parametro di questo tipo – nicopico