Jakenと申します。
制作中のアプリを、有料版と無料版、coreのように、3つのプロジェクトに分けて管理しようとしたところ、
ADTのバグと思われる症状に遭遇しましたので、確認させてください。
問題は、Libraryプロジェクト内のresで、「type="id"」のように指定したリソースが「定数」として認識されないため、switch-case文で記述した場合に、ビルドエラーになることです。
「case R.id.test_id_1:」のように記述すると、「case 式は定数式でなければなりません」のように怒られます。
「if(itemid == R.id.test_id_1)」のようにif文で記述すると、ビルドが通ります。
さらに、case文のまま、プロジェクトの「Is library」のチェックを外してビルドすると通ります。
つまり、ライブラリの時、かつ、switch-case文で判断しているR.idのところだけビルドエラーになるんです。
また、R.id以外のR.layout等は、問題なくビルドが通っています・・・。
これが、あまりにも中途半端で不可解なので、この現象が自分だけなのか・・・
再現する最小構成のファイルを用意しましたので、同じ現象が他の環境でも発生するのか確認したいです。
(自分の環境が問題な場合は、環境構築しなおそうと思っています)
・再現方法
3つのAndroidプロジェクトを使います。
「CantBeChangedLibrary」
外部のライブラリプロジェクトを想定しており、自分では変更しないものです。
Is libraryにチェックを付けています。
「MyLibrary」
自分が作成したライブラリプロジェクトです。
アプリのメイン処理をここで実装するCore部分を想定しています。
Is libraryにチェックを付けています。さらに、CantBeChangedLibraryを参照しています。
ここで、CantBeChangedLibraryのresに定義しているR.idを使う時に問題が発生します。
「MainApp」
アプリCoreの薄いラッパーです。有料版や無料版などの差分だけを入れる部分を想定しています。
Is libraryにチェックはつけていません。MyLibraryを参照しています。
こんな構成のため、「ライブラリの中のライブラリ」という扱い自体が特殊なのかもしれない、とは思っています。
ですが、、、それにしても中途半端な症状なので、仕様とは考えにくいと思っています。
また、genに自動生成されたR.javaを見ても、特に変わった様子はないので、aaptはちゃんと動いているように見えます。
なので、ADTのバグなのではないか・・・という思考に至りました。
とりあえずif文で回避できることは判明したのですが、何が原因だったのか釈然としません。
・開発環境
Windows 7 Ultimate SP1 64bit Core2Duo3GHz メモリ4MB
ADT:Build: v21.1.0-569685
Eclipse:Version: 3.7.2.v20120120-1414-7z8gFcuFMP7BW5XTz0jLTnz0l9B1 Build id: M20120208-0800
※android-sdk_r21.1-windowsにpleiades-1.4.0、jstyle_4.2.2.0-64bitを入れて、UTF-8で書いています。
・最少構成のファイル
以下のDropbox上のURLにありますので、ダウンロードしてください。
https://www.dropbox.com/s/ns30s7s1i6yvg3l/projects.7z
※しばらくは残しておきますが、そのうち消すかもしれません。
projects.7zには、上記3つのサンプルプロジェクトを含んでいます。
※これはビルドエラーが確認できる最小構成なので、アプリとしてはまったく意味がありません。
・確認方法
1.ビルドが通る状態にしてありますので、まずは、3つのプロジェクトのビルドが通る状態にします。
2.MyLibraryプロジェクトのMainActivity.javaを開き、コメントアウトしてあるonMenuItemSelectedメソッドを入れ替えます。
3.ビルドすると、case文の所で「case 式は定数式でなければなりません」になることを確認できると思います。
4.この状態で、MyLibraryプロジェクトのプロパティを開き、Is libraryを外してビルドしてみてください。ビルドが通ります。
思わず吹き出しそうになると思います・・・(汗)
こんなところで数日潰されてしまった orz
もし、私が何か間違えているだけなら、ご指摘頂けるとありがたいです。
ということで、誰か興味のある方、お手数をおかけいたしますが、よろしくお願いします。