2012-05-03 12 views
13

私はAndroidプロジェクトを作成してライブラリにしようとしています。私はこのコードでスローされた例外を取得:Androidライブラリは他のプロジェクトにリソースを引き出しません

_buttonStart = (Button) findViewById(R.id.buttonStart); 

私が手に例外がある:

java.lang.NoSuchFieldError: com.xxx.libraryname.R$id.buttonStart 

Androidのドキュメントは、明示的にライブラリがそれらのリソースにアクセスできるようにすべきであると言っているように見える:

"たとえば、ライブラリプロジェクトのソースコードは、Rクラスを通じて独自のリソースにアクセスできます。

ライブラリの/gen/com.xxx.libraryname/R.java/R/id/を見ると、buttonStartがあります。しかし、私がメインプロジェクトの/gen/com.xxx.libraryname/R.java/R/idを見ると、そうではありません。

私はmake cleanを行っています。

+9

それを実演しました。どちらのプロジェクトも "main.xml"ファイルを持っていました。ライブラリのmain.xmlファイルの名前が変更され、問題が解決しました。 –

+5

同じ名前のリソースがある場合、ホストプロジェクトが勝ちます。おそらく、いくつかの接頭辞表記を介してライブラリに一意のリソース名を付けるのが最善です。したがって、偶発的な衝突はありません。ホストが特にリソースを置き換えることを試みている*意図的な衝突がまだあるかもしれません。その場合、ホストはライブラリが受け入れられるようにしなければなりません(例えば、レイアウトのために同じIDを持つ同じウィジェットを維持する)。 – CommonsWare

+1

@DanJameson回答セクションにもソリューションを追加できますか? – Anirudh

答えて

4

ライブラリプロジェクトのメインレイアウトは、メインプロジェクトと同じ名前のレイアウトmain.xmlになっています。 Androidは、両方が同じレイアウトの名前を持っている場合は、この場合には、プロジェクトをホストするために優先させて頂きます

は「main.xml」最善のアプローチには、偶発的衝突が存在しないので、いくつかの接頭表記を使用することです。

+0

Greate Answer !!! –

関連する問題