私は現在、いくつかのAndroidアプリを開発し、複数のアプリで頻繁に使用するクラスのコードベースを作成しました。このコードはすべてSubversion(svn)リポジトリにあり、各アプリは独自のリポジトリにあります。各アプリには、必要なパッケージ(com.company.android.viewsなど)のsvn:externals参照があります。これは、カスタム属性のためにRクラスをインポートする必要がある場合を除いてうまく機能します。
カスタムビューには、次のようなインポートがあります。
import com.company.apps.myapp.R
次のようなコードを含めることができます。
attributes.getBoolean(R.styleable.WebImageView_autoload, autoload)
そのカスタム属性は、res / values/attrs.xmlで定義されています。
<declare-styleable name="WebImageView">
<attr name="autoload" format="boolean" />
...others
</declare-styleable>
これは完全に機能しますが、これと同じビューを使用する2番目のアプリがある場合に問題が発生します。次に、インポートをに更新してimport com.company.apps.anotherapp.R
、「anotherapp」で動作し、「myapp」で機能しないようにします。一度に複数のアプリで作業する場合、これが問題になります。
私の一時的な解決策は、該当するクラスの更新をチェックインしてから、svn:externalsをその特定のリビジョンにロックすることでした。各アプリは最終的に異なるリビジョンにロックされるため、処理が速くなりますが、さまざまなクラスをアプリのリポジトリに直接コピーするよりも優れているようです。
リフレクションを使用して私が考えた他の唯一の解決策は、次のようなものです。
Class class = Class.forName(context.getPackageName() + ".R");
Field[] fields = class.getDeclaredFields();
次に、フィールドをループして、気になるフィールドをクラス全体で使用される変数に割り当てます。ただし、これはかなり手間がかかるように思われます。特に、これを行う必要のあるいくつかのクラスについて話している場合はなおさらです。
この問題を解決するにはどうすればよいですか?com.company.apps。*。Rを動的にインポートする方法、または特定のアプリに依存しない別のRクラスを何らかの方法で生成する方法はありますか?または、私が完全に見逃した他の明白な(またはそれほど明白ではない)解決策はありますか?