2012-04-23 13 views
9

Sto creando un paio di app di librerie Android per un progetto. Per semplificare la domanda, supponiamo di avere due librerie (utilLib, screenLib) in questo progetto (ora verrà indicato come app).In che modo Android gestisce più R.java?

C'è una risorsa String con lo stesso nome all'interno di ogni progetto ma con valori diversi. Come questo:

utilLib

<string name="app_version">1.0</string> 
<string name="hello">UtilLib Hello</string> 

screenLib

<string name="app_version">0.7a</string> 
<string name="hello">ScreenLib Hello</string> 

app

<string name="app_version">0.1</string> 

mi sono reso conto che posso fare riferimento alla stringa utilizzando com.package.R ma cosa succede se il mio codice appare come questo che verrà visualizzato?

<!-- language: java --> 
import com.app.R; 
... 

private void checkValue(){ 
    String version = getString(R.app_version); 
    Log.d(TAG, "version: " + version); // 0.1 show be here 
    String hello = getString(R.hello); 
    Log.d(TAG, "Hello: " + hello); // <---- ? ('UtilLib Hello' or 'ScreenLib Hello') 
} 

Io sto cercando di fare accumulo modulare qui, ma non pienamente capisco come Android priorità suo R.java da usare. Qualcuno ha avuto esperienza con questo?

risposta

12
Log.d(TAG, "version: " + version); // 0.1 show be here 

Motivo citando guida dev ufficiale Managing Projects - Library Projects:

Quando si crea un'applicazione che dipende da un progetto di libreria, gli strumenti SDK compilare la libreria in un file JAR temporanea e la utilizza nella principale progetto, quindi utilizza il risultato per generare .apk. Nei casi in cui un ID risorsa è definito sia nell'applicazione che nella libreria, gli strumenti assicurano che la risorsa dichiarata nell'applicazione abbia priorità e che la risorsa nel progetto della libreria non sia compilata nell'applicazione .apk. Ciò offre alla tua applicazione la flessibilità di utilizzare o ridefinire qualsiasi comportamento o valore di risorse definito in qualsiasi libreria.


Log.d(TAG, "Hello: " + hello); // <---- ? ('UtilLib Hello' or 'ScreenLib Hello') 

questo è determinato in base alla priorità progetto di libreria.

Citando guida dev ufficiale Managing Project -Library Projects:

  • risorse in conflitto

    Poiché gli strumenti si fondono le risorse di un progetto di libreria con quelle di un progetto di applicazione dipendente, una data risorsa L'ID potrebbe essere definito in entrambi i progetti. In questo caso, gli strumenti selezionano la risorsa dall'applicazione o la libreria con la priorità più alta e scarta l'altra risorsa. Man mano che sviluppi le tue applicazioni, tieni presente che è probabile che gli ID delle risorse comuni vengano definiti in più di un progetto e verranno uniti, con la priorità della risorsa dall'applicazione o della libreria con priorità più alta.

Citando guida dev ufficiale From Eclipse with ADT - Referencing a library project:

Se si aggiungono i riferimenti a librerie multiple, si noti che è possibile impostare la loro priorità relativa (e l'ordine merge) selezionando una biblioteca e l'utilizzo i comandi Su e Giù. Gli strumenti uniscono le librerie di riferimento con l'applicazione a partire dalla priorità più bassa (parte inferiore dell'elenco) a quella più alta (parte superiore dell'elenco). Se più di una libreria definisce lo stesso ID di risorsa, gli strumenti selezionano la risorsa dalla libreria con priorità più alta. L'applicazione stessa ha la priorità più alta e le sue risorse vengono sempre utilizzate preferibilmente a ID di risorsa identici definiti nelle librerie.

Citando guida dev ufficiale From the Command Line - Referencing a Library Project:

Se si aggiungono i riferimenti a librerie multiple, si noti che è possibile impostare la loro priorità relativa (e l'ordine merge) modificando manualmente il file project.properties e aggiustando l'indice .n di ogni riferimento come appropriato. Ad esempio, si supponga questi riferimenti:

android.library.reference.1=path/to/library_projectA 
android.library.reference.2=path/to/library_projectB 
android.library.reference.3=path/to/library_projectC 

È possibile riordinare i riferimenti a dare la massima priorità alla library_projectC in questo modo:

android.library.reference.2=path/to/library_projectA 
android.library.reference.3=path/to/library_projectB 
android.library.reference.1=path/to/library_projectC 

non riesco a trovare una parola che può spiegare questo più chiaro rispetto alla guida ufficiale di sviluppo.

+1

Non ho mai dato una buona lettura ai Progetti di gestione. Sciocchimi, lo farò stasera. Grazie mille: D – RobGThai

+1

Ho letto molti libri/guida in linea coprono diverse tecnologie di programmazione da diverse pubblicazioni. Guida ufficiale per sviluppatori Android IMO è la migliore, semplice parola inglese con esempi completi di codice e frammenti di codice. Questo è uno dei motivi principali per cui lo scelgo su Cocoa/ObjectiveC :) – yorkw

-1

si dovrà importare com.screenLib.R e com.utilLib.R
Nel codice probabilmente dovrebbe lanciare un errore "non può risolvere ciao"

Lemmme so se questo è giusto !!!!

+0

Il progetto è stato risolto anche senza che me ne importasse nessuno R. Eclipse lo mostra come ** com.app.R.hello ** ma chiaramente non ce n'è uno. – RobGThai

Problemi correlati