2012-04-07 12 views
19

Ho una libreria Android MyLib contenente tutto ciò di cui ho bisogno per la mia app (con targeting per Android 2.2). Questa libreria ha una risorsa XML:Impossibile sovrascrivere la risorsa xml della libreria con la risorsa png nell'applicazione?

drawable/main_background.xml 

Nel mio progetto di applicazione MyApp I Riferimento MyLib. Qui voglio sovrascrivere risorse specifiche (ad esempio il branding). Così ho aggiunto un'immagine di sfondo in MyApp:

drawable/main_background.png 

Eclipse continua a darmi questo errore:

[com.mycom.mylib.myapp] res\drawable\main_background.xml:0: error: Resource entry main_background is already defined. 
[com.mycom.mylib.myapp] res\drawable\main_background.png:0: Originally defined here. 

Come posso ignorare la risorsa nel progetto biblioteca?

+0

hai ancora qualche soluzione a questo problema? – Sam

+0

Siamo spiacenti. Ho rinunciato a questo. Alla fine ho fatto un png che sembrava il mio xml. Sono ancora sconvolto dal fatto che ho dovuto sprecare quei kB :) – l33t

risposta

10

Non puoi semplicemente sovrascrivere l'ID risorsa (è l'ID risorsa che stai sovrascrivendo, non il file vero e proprio) con un file con diversa estensione in Android SDK. Tuttavia, puoi eseguire il trucco inserendo il tuo file xml di progetto con lo stesso nome (main_background.xml) e riempirlo in modo corretto per visualizzare il nuovo file (main_background.png), che è necessario rinominare in precedenza. Tutto sintassi che serve è descibed qui:

http://developer.android.com/guide/topics/resources/drawable-resource.html

, nel tuo caso potrebbe essere semplicemente (supponendo che si mettere questo nel vostro progetto non-biblioteca come main_background.xml, e hai il tuo nuovo png come main_background_new.png):

<?xml version="1.0" encoding="utf-8"?> 
<bitmap 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/main_background_new" /> 

Con la soluzione di cui sopra, è possibile fare riferimento a @drawable/main_background dal progetto e utilizzare il file incluso in tale progetto, anziché uno di libreria.

+1

Salve, sì capisco questo, è simile all'esempio che ho postato nella mia risposta, ma l'API afferma che hai la possibilità di sovrascrivere resiuce ID (non commenta le estensioni) , quindi, ad essere onesti, sto iniziando a pensare che sia degno di un bug report. – Sam

+0

Ciao, Ive ti ha assegnato la taglia come hai fornito un miglioramento alla soluzione che ho citato nel mio post. Tuttavia, sono abbastanza sicuro che tu/dovresti essere in grado di sovrascrivere resourceIDs indipendentemente dall'estensione, quindi penso che dovrei presentare una segnalazione di bug quando avrò tempo – Sam

+0

Grazie, ma non penso che sarà mai possibile, anche se - Il sistema attuale tratta tutte le risorse delle librerie e del progetto come se fossero di un progetto e utilizza lo stesso algoritmo di creazione dell'ID risorsa: dovrebbe essere possibile includere prima due file con lo stesso nome e diversa estensione in un progetto. –

3

Così una 'soluzione' a questo problema, che non ritengo di essere una risposta è la seguente:

definire un documento XML nella libreria in questione (che chiameremo bunny.xml) e fare riferimento ad un altro xml di nome simile (bunny_drawn.xml) con il contenuto effettivo da visualizzare.

Poi, nel progetto di destinazione, sovrascriveremo bunny.xml con un altro e utilizzarlo per fare riferimento a un'immagine con un nome diverso invece - bunny_image.png

Questo, tuttavia, non risolve il problema, in primo luogo perché aren tecnicamente ignorando un png con un xml (anche se l'effetto è un po 'vicino a quello). In secondo luogo perché una delle caratteristiche chiave di override di risorse è che sono sovrascritti, vale a dire che NON sono compilati nel APK:

the tools ensure that the resource declared in the application gets priority and that the resource in the library project is not compiled into the application .apk

Ma la bunny_drawn.xml saranno ancora compilati in! Siamo in grado di superare il secondo punto, non solo definendo l'immagine da sostituire nell'AP bersaglio, ma anche sostituendo il vecchio target bunny_drawn.xml con un xml vuoto. (o, come ha sottolineato Fenix, si può avere il contenuto di bunny_drawn.xml all'interno di bunny.xml nel primo caso - resta il fatto che l'ID risorsa non può essere sostituito ...)

Quindi il mio finale la conclusione è che questo deve essere presentato come un bug negli Strumenti per sviluppatori.

4
[com.mycom.mylib.myapp] res\drawable\main_background.xml:0: error: Resource entry main_background is already defined. 
[com.mycom.mylib.myapp] res\drawable\main_background.png:0: Originally defined here. 

Non credo che si possa avere lo stesso nome di file anche con estensioni diverse. Prova a nominare il png qualcos'altro.

Ora, non ho usato l'override, quindi questo sembra strano come ci si aspetterebbe che questo sia il modo in cui si sostituisce la risorsa. Comunque penso che tu abbia o meno le due risorse nella tua lib nominate allo stesso modo. E che nel tuo progetto potrebbe essere ok avere una risorsa con lo stesso nome. Vorrei comunque controllare che sia ok per avere tipi diversi. XML è diverso da png, e se accedi alla risorsa dal codice potresti ottenere errori di tipo.

Permettetemi di chiarire il punto precedente. Comprendo che un progetto di libreria può avere un articolo con lo stesso ID di risorsa di un elemento nell'applicazione.

Tuttavia, l'errore precedente suggerisce che sia main_background.png che main_background.xml si trovano nello stesso progetto ([com.mycom.mylib.myapp]) che non credo sia corretto.

Ulteriore lettura

Questa pagina descrive i diversi tipi di progetti, tra cui il progetto di libreria http://developer.android.com/tools/projects/index.html

Ora io non so dove ho avuto l'impressione di aver guardato di nuovo, ma semplicemente non lo fa indicare ovunque che è possibile sovrascrivere una risorsa utilizzando lo stesso nome di risorsa. Dio solo sa perché ho pensato che fosse una caratteristica.

Quindi no, la stessa regola si applica per quanto posso dire, che le risorse devono essere denominate in modo univoco anche attraverso i progetti di libreria, altrimenti gli ID di risorsa generati entreranno in conflitto. (L'errore si ottiene)

Ciò che viene spiegato è come vengono gestiti i conflitti di risorse.

Resource conflicts Since the tools merge the resources of a library project with those of a dependent application project, a given resource ID might be defined in both projects. In this case, the tools select the resource from the application, or the library with highest priority, and discard the other resource. As you develop your applications, be aware that common resource IDs are likely to be defined in more than one project and will be merged, with the resource from the application or highest-priority library taking precedence.

Il sistema utilizzerà la risorsa con la massima priorità, scartando tutto il resto. Che strano, è che si potrebbe pensare che un errore di compilazione non si verificherebbe in quanto il compilatore dovrebbe scartare la risorsa. Ciò mi fa pensare che il poster originale avesse le risorse con lo stesso nome nello stesso stesso progetto, e non attraverso la lib e il progetto.

Non ho letto da nessuna parte che questa sia effettivamente una funzione prevista. Hai qualche link per dire altrimenti? (commentali)

+0

Beh, si suppone che sia una 'caratteristica' o almeno una 'proprietà' dei progetti di libreria, come da preventivo e la citazione dell'API nel commento di bounty. Funzionerà per risorse con un nome identico (inclusa l'estensione), ma non è un resourceID - che è qualcosa a cui fai riferimento in un layout. – Sam

+0

anche se l'OP aveva le risorse nello stesso progetto, io certamente no e avevo lo stesso problema. Quindi, se ottieni un errore del compilatore con risorse con lo stesso nome (ma estensione diversa) in librerie diverse, sei d'accordo che questo dovrebbe essere segnalato come un bug degli strumenti per sviluppatori? – Sam

+0

Sì, ma so anche che c'è un problema con lo scostamento dell'id di risorsa tra i progetti a causa del modo in cui sono collegati/setup, che è il problema, non riesco proprio a trovare il post SO che si occupa di esso. Sollevalo come un problema. – Emile

Problemi correlati