Android では同名の id や layout は避けるべき2013年12月15日 11時55分18秒

Android では 「layout」や「menu」、「values」等の「res」で作られるリソースには R クラスが自動生成されて、各々に id が与えられる。この R.java を覗いて見ると、同じ番号から順に生成されている。

現在の Eclipse での Android プロジェクトを見てみると、ライブラリを利用すると、依存しているライブラリのこれらのリソースを元に、プロジェクト内に R.java が生成されるようだ。これらの R.java を見ると同じ番号が割り当てられている。コード内で直にこれらの番号を使うことは無いのでこれ自体は問題はない。

しかし、どうもこれらの名前はそうもいかないようだ。ライブラリとプロジェクトにて同名のレイアウトがあった。ライブラリ単体で使うときは問題ないのだが、プロジェクトがオーバーライドして使うライブラリでも問題が出る。findViewById で見付けられないのだ。よく見る setContentView を呼ばずに、動作しないケースとは異なる。名前空間から指定して呼んでいるので、クラスの入れ違いは考えにくいが、指定している名前のコンポーネントが見付けられないのだ。

一番簡単で明解な回避方法は、同じ名前を使用しないこと。プロジェクトのレイアウトを改名したら、ライブラリは正しく動き始めた。随分、後向きな解決ではある。何はともあれ、同じ名前を付けていると混乱の元になるので悪い解決方法でも無い。