私は、他の開発者が独自のアプリケーション内で使用できるように配布したい、再利用可能な Android コードに取り組んでいます。コードには、1 つのパッケージ (Jar ファイル) に含めて参照できるようにしたいリソースの依存関係 (レイアウト、xml、png ドローアブル) がいくつかあります。
これは可能ですか?もしそうなら、これを行うための最良の方法は何ですか?
私は、他の開発者が独自のアプリケーション内で使用できるように配布したい、再利用可能な Android コードに取り組んでいます。コードには、1 つのパッケージ (Jar ファイル) に含めて参照できるようにしたいリソースの依存関係 (レイアウト、xml、png ドローアブル) がいくつかあります。
これは可能ですか?もしそうなら、これを行うための最良の方法は何ですか?
AndroidはフォルダR
配下のリソースファイルでクラスを自動生成するため、クラスをそのまま利用することはできません。/res
R
final static
jar
ファイルでファイルを使用する良い解決策を見つけましたres
。これが私がやった方法です:
jar
ファイルにエクスポートされるソース コードでは、コンパイル時に最終的な静的メモリ アドレスに置き換えられるため、変数を使用しないでください。 R
を使用する代わりに、R
以下の独自の方法を作成しました。
public static int getResourceIdByName(String packageName, String className, String name) {
Class r = null;
int id = 0;
try {
r = Class.forName(packageName + ".R");
Class[] classes = r.getClasses();
Class desireClass = null;
for (int i = 0; i < classes.length; i++) {
if (classes[i].getName().split("\\$")[1].equals(className)) {
desireClass = classes[i];
break;
}
}
if (desireClass != null) {
id = desireClass.getField(name).getInt(desireClass);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return id;
}
たとえば、 という名前のレイアウトがある場合main.xml
、次のメソッドを呼び出して取得できます。
int id = getResourceIdByName(context.getPackageName(), "layout", "main");
id
「text1」の文字列がある場合は、メソッドを呼び出すことで取得できます
int id = getResourceIdByName(context.getPackageName(), "string", "text1");
このメソッドは、実行時にリソース ID を提供します。リフレクション API を使用して、R
実行時のステータスを取得します。
このメソッドを使用すると、R
変数の使用を避けることができます。
res
ファイルをターゲット プロジェクトにコピーします。
建てる。
楽観的なニュースはありません。一般に、独自のパッケージを期待するほど簡単に配布することはできません。主な問題は、自動生成された R ファイルです。おそらく、いくつかの参照を作成します-レイアウトとドローアブルがあります。ライブラリのユーザーは、ライブラリが提供するものではなく、リソースの ID を含む独自の R ファイルを持ちます。
ドローアブル リソースの場合、R ファイルを使用せずに従来の方法で読み取ることができます。しかし、私が知る限り、外部の xml ファイルからレイアウトを膨らませることはできません。
したがって、ここでの醜いハックは、ライブラリをすべてのリソースと一緒に配布することであり、ユーザーはそのリソースを自分の「res」フォルダーにコピーする必要があります。正直なところ、あなたの問題に対する良い解決策はありません...申し訳ありません。よろしく!
レイアウト:
Javaソースのハードコード
xml&png:
たとえば、xmlとpngをプロジェクトのsrcフォルダーにコピーし、パッケージをjarにコピーします。
a.pngをsrc/com / example/testにコピーします
次のJavaコードとしてロードします。
InputStream is = YourClassName.class.getClassLoader().getResourceAsStream("com/example/test/a.png");
if ( null != is )
{
Bitmap bmp = BitmapFactory.decodeStream(is);
aapt
Android SDK のツールで次のオプションが使用できることがわかりました。
--non-constant-id Make the resources ID non constant. This is required to make an R java class that does not contain the final value but is used to make reusable compiled libraries that need to access resources.
これは有望に思えますが、私はこれを試していないので、うまくいくかどうかはわかりません. これは、上記の @JJKim の投稿で対処された問題を回避するためだと思われます。
Android メソッドを使用してリソース ID を動的に取得できます。
int preferences = context.getResources().getIdentifier("preferences", "xml", context.getPackageName());
後で、リソースを新しいプロジェクトに含める (コピーする) 必要があります。
こんにちは、これは遅い応答だと思いますが、それでも AAR について何を通知するかだけです
Android ARchive - このファイルには res ファイルとマニフェスト ファイルを保持できるため、他の開発者は aar をプロジェクトにインポートしてコードをコンパイルできます。
この方法では、マニフェストのマージ エラーが発生する可能性があります。マニフェストで置換プロパティを使用するための修正であり、これは配布前に確認する必要があります。
私はuser558185ソリューションを使用していましたが、もっと簡単な方法があります。リソースがライブラリ プロジェクト (Cordova プラグインなど) にある場合は、次のコマンドでリソースを取得できます。context.getResources().getIdentifier(name, className, context.getPackageName());
これは、ライブラリ プロジェクト リソースの R ファイルが正しく生成されず、R packageName がライブラリ プロジェクトで必要な packageName と一致しなかった場合に発生します。
使い方はuser558185の回答と同じですが、ネイティブのAndroidメソッドを使用しています。
抽象化を使用して、実装クラス (ユーザー) から R 値を取得できます。
protected abstract void getMyLayoutTextBox(int myLayoutTextBox);
次に、ユーザーはクラスを拡張し (これは を拡張しますActivity
)、このメソッドを実装する必要があります。あなたのクラスでは、呼び出すだけでgetMyLayoutTextBox()
、ユーザーが配布可能な jar を実装した後、正しい R 値が提供されます。
抽象化の詳細については、こちらを参照してください。
Eclipse を使用している場合は、 project に移動します"Properties->Java Build Path"
。タブ"Source"
の下に、圧縮したい res フォルダーを追加します(例: res/raw)。
.classpath
次の行をファイル<classpathentry kind="src" path="res/raw"/>に追加します
ビルドが完了すると、新しい jar ファイルにはフォルダー内のファイルが含まれres/raw/
ます。user558185が提案したように、それらにアクセスできます。