20

アプリに必要なものすべてを含むAndroid ライブラリMyLibがあります (Android 2.2 を対象としています)。このライブラリには XML リソースがあります。

drawable/main_background.xml

私のアプリケーションMyAppプロジェクトでは、 を参照していますMyLib。ここでは、特定のリソース (つまり、ブランディング) をオーバーライドしたいと考えています。だから私は背景画像を追加しましたMyApp

drawable/main_background.png

Eclipseは私にこのエラーを与え続けます:

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

ライブラリ プロジェクトのリソースをオーバーライドするにはどうすればよいですか?

4

3 に答える 3

11

Android SDK では、拡張子が異なるファイルでリソース ID (実際のファイルではなく、オーバーライドするリソース ID) を単純にオーバーライドすることはできません。ただし、プロジェクト xml ファイルを同じ名前 ( main_background.xml) で配置し、適切な方法で入力して新しいファイル ( main_background.png) を表示することで、トリックを行うことができます。これは、以前に名前を変更する必要があります。必要な構文はすべてここに記述されています。

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

、あなたの場合、それは単純かもしれません(これを非ライブラリプロジェクトに として入れmain_background.xml、新しいpngを として持っていると仮定します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" />

上記のソリューションでは、プロジェクトから参照でき@drawable/main_background、ライブラリの代わりにそのプロジェクトに含まれているファイルを使用する必要があります。

于 2012-08-28T07:52:39.693 に答える
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.

拡張子が異なっていても、同じファイル名を持つことはできないと思います。png に別の名前を付けてみてください。

今、私はオーバーライドを使用していないので、これがアセットをオーバーライドする方法であると予想されるため、これは奇妙に思えます。ただし、ライブラリに同じ名前の2つのアセットがあると思います。そして、あなたのプロジェクトでは、同じ名前のアセットを持っていても問題ないかもしれません. ただし、さまざまなタイプがあっても問題ないことを確認します。XML は png とは異なり、コードからアセットにアクセスすると、タイプ エラーが発生する可能性があります。

上記の点を明確にさせてください。ライブラリ プロジェクトには、アプリケーション内のアイテムと同じリソース ID を持つアイテムを含めることができることを理解しています。

ただし、上記のエラーは、main_background.png と main_background.xml の両方が同じプロジェクト ([com.mycom.mylib.myapp]) にあることを示唆していますが、これは正しいとは思えません。

参考文献

このページでは、ライブラリ プロジェクトhttp://developer.android.com/tools/projects/index.htmlを含むさまざまな種類のプロジェクトについて説明します。

どこから印象を受けたのかわかりませんが、もう一度見てみると、同じリソース名を使用してリソースをオーバーライドできるとはどこにも述べられていません。なぜそれが機能だと思ったのか神は知っています。

いいえ、私が知る限り、同じルールが適用されます。ライブラリ プロジェクト間でもリソースに一意の名前を付ける必要があります。そうしないと、生成されたリソース ID が競合します。(あなたが得るエラー)

説明されているのは、リソースの競合がどのように管理されるかです。

リソースの競合 ツールはライブラリ プロジェクトのリソースを依存アプリケーション プロジェクトのリソースとマージするため、特定のリソース ID が両方のプロジェクトで定義される場合があります。この場合、ツールはアプリケーションからリソースを選択するか、優先順位が最も高いライブラリを選択し、他のリソースを破棄します。アプリケーションを開発するときは、共通のリソース ID が複数のプロジェクトで定義されている可能性が高く、アプリケーションまたは最優先ライブラリのリソースが優先されてマージされることに注意してください。

システムは優先度が最も高いリソースを使用し、それ以外はすべて破棄します。奇妙なことに、コンパイラはリソースを破棄する必要があるため、コンパイル エラーは発生しないと考えるでしょう。これにより、元のポスターには、同じプロジェクト内に同様の名前のアセットがあり、lib とプロジェクトにまたがっていなかったと思います。

これが実際に意図された機能であることをどこにも読んだことがありません。別の言い方をするリンクはありますか?(コメントしてください)

于 2012-08-27T20:58:42.643 に答える
3

したがって、この問題に対する1つの「解決策」は、私が答えとは見なさないものです。

問題のライブラリでXMLドキュメントを定義し(これをbunny.xmlと呼びます)、表示される実際のコンテンツと同じ名前の別のxml(bunny_drawn.xml)を参照するようにします。

次に、ターゲットプロジェクトで、bunny.xmlを別のプロジェクトでオーバーライドし、それを使用して、代わりに別の名前の画像を参照します--bunny_image.png

ただし、これは問題を解決しません。最初に、xmlでpngを技術的にオーバーライドしていないためです(ただし、効果はそれにいくらか近いです)。次に、リソースのオーバーライドの重要な機能の1つは、リソースがオーバーライドされることです。つまり、APKにコンパイルされません。

ツールは、アプリケーションで宣言されたリソースが優先され、ライブラリプロジェクトのリソースがアプリケーション.apkにコンパイルされないようにします。

ただし、bunny_drawn.xmlは引き続きコンパイルされます。ターゲットAPPで置き換える画像を定義するだけでなく、古いターゲットbunny_drawn.xmlを空白のxmlに置き換えることで、2番目のポイントをある程度克服できます。(または、Fenixが指摘したように、最初のケースではbunny.xml内にbunny_drawn.xmlの内容を含めることができます。リソースIDを置き換えることができないという事実は依然として残っています...)

したがって、私の最終的な結論は、これは開発ツールのバグとして提出する必要があるということです。

于 2012-08-27T20:46:47.863 に答える