2012-04-07 3 views
19

Ich habe eine Android-Bibliothek MyLib enthält alles, was ich für meine App (Targeting Android 2.2) brauche. Diese Bibliothek verfügt über eine XML-Ressource:Kann die XML-Ressource der Bibliothek nicht mit der PNG-Ressource in der Anwendung überschreiben?

drawable/main_background.xml 

in meiner Anwendung MyApp Projekt I MyLib verweisen. Hier möchte ich bestimmte Ressourcen (d. H. Branding) überschreiben. So habe ich ein Hintergrundbild in MyApp:

drawable/main_background.png 

Eklipse hält mir diesen Fehler geben:

[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. 

Wie kann ich die Ressource in der Bibliothek Projekt außer Kraft setzen?

+0

Haben Sie schon eine Lösung für dieses Problem? – Sam

+0

Entschuldigung. Ich habe das aufgegeben. Ich machte endlich einen PNG, der wie mein Xml aussah. Ich bin immer noch verärgert darüber, dass ich diese kb verschwenden musste :) – l33t

Antwort

10

Sie können nicht einfach Ressourcen-ID (es ist die Ressourcen-ID, die Sie überschreiben, nicht die eigentliche Datei) mit einer Datei mit anderer Erweiterung in Android SDK überschreiben. Sie können jedoch den Trick machen, indem Sie Ihre Projekt-XML-Datei mit dem gleichen Namen (main_background.xml) einfügen und sie ordnungsgemäß ausfüllen, um Ihre neue Datei (main_background.png) anzuzeigen, die Sie zuvor umbenennen müssen. Alle Syntax, die Sie brauchen, ist hier descibed:

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

, in Ihrem Fall könnte es einfach sein (vorausgesetzt, Sie dies in Ihrem Nicht-Bibliotheksprojekt als main_background.xml, und Sie haben Ihre neue png als main_background_new.png):

Mit der obigen Lösung können Sie von Ihrem Projekt auf @drawable/main_background verweisen und es sollte Ihre Datei, die in diesem Projekt enthalten ist, statt einer Bibliothek verwenden.

+1

Hallo, ja, ich verstehe das, es ist ähnlich dem Beispiel, das ich in meiner Antwort geschrieben, aber die API besagt, dass Sie resouce IDs überschreiben können (es kommentiert keine Erweiterungen) Also, um ehrlich zu sein, fange ich an zu denken, dass dies einen Fehlerbericht verdient. – Sam

+0

Hallo, ich habe dir das Bounty zugesprochen, da du die Workaround verbessert hast, die ich in meinem Beitrag erwähnt habe. Allerdings bin ich mir ziemlich sicher, dass Sie ResourceIDs unabhängig von der Erweiterung überschreiben können, daher denke ich, dass ich einen Fehlerbericht einreichen werde, wenn ich Zeit bekomme. – Sam

+0

Danke, aber ich denke nicht, dass es jemals möglich sein wird - Das aktuelle System behandelt alle Ressourcen aus Bibliotheken und das Projekt wie in einem Projekt und verwendet den gleichen Ressourcen-ID-Erstellungsalgorithmus. Es sollte möglich sein, zuerst zwei Dateien mit dem gleichen Namen und der unterschiedlichen Erweiterung in ein Projekt aufzunehmen. –

3

So eine ‚Lösung‘ dieses Problems, das halte ich nicht eine Antwort sein, ist die folgende:

ein XML-Dokument in der Bibliothek in Frage definieren (wir nennen es bunny.xml) und verweisen Sie auf eine andere XML-Datei ähnlichen Namens (bunny_drawn.xml) mit dem tatsächlichen Inhalt, der angezeigt werden soll.

Dann im Zielprojekt, außer Kraft setzen mit einem anderen bunny.xml und verwenden Sie es mit einem anderen Namen, anstatt auf ein Bild zu beziehen - bunny_image.png

Dies schließt jedoch nicht das Problem zu lösen, zum einen, weil wir aren Ein png mit einem xml technisch nicht überschreiben (obwohl der Effekt etwas nah ist). Zweitens, weil eine der wichtigsten Features von Ressourcen überschrieben wird sie außer Kraft gesetzt werden, das heißt, sie werden nicht in die APK zusammengestellt:

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

Aber die bunny_drawn.xml wird noch in kompiliert werden! Wir können den zweiten Punkt überwinden, indem wir nicht nur das Bild definieren, das in der Ziel-APP ersetzt werden soll, sondern auch das alte Ziel bunny_drawn.xml durch ein leeres xml ersetzen. (oder, wie Fenix ​​darauf hingewiesen hat, können Sie den Inhalt von bunny_drawn.xml in bunny.xml im ersten Fall haben - die Tatsache bleibt immer noch, dass die Ressourcen-ID nicht ersetzt werden kann ...)

Also mein Finale Fazit ist, dass dies als Bug in den Developer Tools eingereicht werden muss.

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. 

Ich glaube nicht, dass Sie den gleichen Dateinamen auch mit verschiedenen Erweiterungen haben können. Versuchen Sie, das Png etwas anderes zu benennen.

Jetzt habe ich nicht überschrieben, also scheint dies seltsam, da Sie erwarten, dass dies wie Sie das Asset überschreiben. Aber ich denke, Sie haben entweder die beiden Assets in Ihrer Bibliothek gleich benannt. Und in Ihrem Projekt könnte es in Ordnung sein, ein Asset mit dem gleichen Namen zu haben. Ich würde jedoch prüfen, ob es ok ist, verschiedene Arten zu haben. XML ist anders als png, und wenn Sie aus Code auf das Asset zugreifen, könnten Sie Typfehler bekommen.

Lassen Sie mich den obigen Punkt verdeutlichen. Ich verstehe, dass ein Bibliotheksprojekt ein Element mit der gleichen Ressourcen-ID wie ein Element in Ihrer Anwendung haben kann.

Der obige Fehler deutet jedoch darauf hin, dass sich main_background.png und main_background.xml im selben Projekt befinden ([com.mycom.mylib.myapp]), was ich nicht für korrekt halte.

Literatur

dieser Seite werden die verschiedenen Arten von Projekten einschließlich der Bibliotheksprojekt http://developer.android.com/tools/projects/index.html

Jetzt beschreibt ich weiß nicht, woher ich den Eindruck gewonnen, aber nachdem sah wieder es einfach nicht Geben Sie an einer beliebigen Stelle an, dass Sie eine Ressource überschreiben können, indem Sie denselben Ressourcennamen verwenden. Gott weiß warum ich dachte das war ein Feature.

Also nein, die gleiche Regel gilt, soweit ich sagen kann, dass Ressourcen auch über Bibliotheksprojekte hinweg eindeutig benannt werden müssen, da sonst die generierten Ressourcen-IDs in Konflikt geraten. (Der Fehler, den Sie bekommen)

Was wird erläutert, wie Ressourcenkonflikte verwaltet werden.

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.

Das System verwendet die Ressource mit der höchsten Priorität und verwirft alles andere. Was seltsam ist, ist, dass Sie denken würden, dass ein Kompilierungsfehler nicht auftreten würde, da der Compiler die Ressource verwerfen sollte. Das lässt mich glauben, dass das Original-Poster die gleichnamigen Assets im Projekt selbe hatte und nicht über die lib und das Projekt.

Ich habe nirgends gelesen, dass dies eigentlich eine beabsichtigte Funktion ist. Haben Sie irgendwelche Links, um etwas anderes zu sagen? (Kommentiere sie)

+0

Nun, es soll ein "Feature" oder zumindest eine "Eigenschaft" von Bibliotheksprojekten sein, wie in Ihrem Zitat und dem API-Zitat im Kopfgeldkommentar. Es funktioniert für Ressourcen mit einem identischen Namen (einschließlich der Erweiterung), aber das ist keine ResourceID - das ist etwas, auf das Sie in einem Layout verweisen. – Sam

+0

auch, wenn das OP hatte die Ressourcen in das gleiche Projekt, ich sicherlich nicht, und hatte das gleiche Problem. Wenn Sie also einen Compilerfehler mit Ressourcen desselben Namens (aber unterschiedlicher Erweiterung) in verschiedenen Bibliotheken erhalten, stimmen Sie zu, dass dies als Fehler in der Developer Tools gemeldet werden sollte? – Sam

+0

Ja, aber ich weiß auch, dass es ein Problem gibt, bei dem die Ressourcen-ID aufgrund der Art und Weise, wie sie verlinkt sind, zwischen Projekten kollidiert, was das Problem ist. Ich kann den SO-Beitrag, der damit beschäftigt ist, einfach nicht finden. Heben Sie es als ein Problem auf. – Emile

Verwandte Themen