Android リソース ファイルを配布可能な Jar ファイル内にパッケージ化する
-
22-09-2019 - |
質問
私は再利用可能な Android コードに取り組んでおり、他の開発者が独自のアプリケーション内で使用できるように配布したいと考えています。コードには、単一のパッケージ (Jar ファイル) 内に含めて参照できるようにしたいリソースの依存関係 (レイアウト、xml、png ドローアブル) がいくつかあります。
これは可能ですか?可能であれば、これを行うための最良の方法は何ですか?
解決
私はあなたのための任意の楽観的なニュースがありません。一般的にはあなたに簡単にあなたが期待するよう、独自のパッケージを配布することはできません。主な問題は、自動生成されたRファイルです。おそらく、それにはいくつかの参照を作る - あなたのレイアウトやドローアブルを持っています。ないあなたのライブラリーが提供するもののために、彼のリソースのIDを含む - あなたのライブラリーの利用者は、彼自身のRファイルを持っています。
この 描画可能なリソースの場合では、Rファイルなしで、古典的な方法でそれらを読むことができます。しかし、これまで私は、外部のXMLファイルからレイアウトを膨らませることができません知っています。
このここに醜いハックは、ユーザーが自分の「RES」フォルダにコピーする必要がありますすべてのリソースと一緒にあなたのライブラリーを配布することですので。正直に言うと、あなたの問題に対する良い解決策は申し訳ありません...ありません。 よろしく!
他のヒント
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
ファイルをターゲットプロジェクトに追加します。建てる。
レイアウトます:
Javaソースでハードコード
<時間>XML&PNGます:
は、
たとえば、プロジェクトのsrcフォルダとパッケージにjarファイルにXML&PNGをコピーしますコピーa.pngへのsrc / COM /例/テスト
Javaのコードを以下のようにそれをロードします:
InputStream is = YourClassName.class.getClassLoader().getResourceAsStream("com/example/test/a.png");
if ( null != is )
{
Bitmap bmp = BitmapFactory.decodeStream(is);
私だけのAndroid SDKのaapt
ツールは、以下のオプションを可能にすることがわかりました
--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.
この音は、それが動作するかどうか、私は手掛かりを持っていないので、私はこれを試していないものの、有望。私は、この問題は上記J.J.Kimのポスト@によって対処周りを取得することである疑います。
あなたが動的にアンドロイドの方法を使用してリソースIDを取得することができます。
int preferences = context.getResources().getIdentifier("preferences", "xml", context.getPackageName());
その後、あなたのリソースが新しいプロジェクトに(コピー)が含まれる必要がある。
私は user558185 のソリューションを使用しますが、ここで、より簡単な方法ですました。あなたのリソースは、(例えばコルドバプラグイン用)ライブラリプロジェクト内にある場合、あなたはcontext.getResources().getIdentifier(name, className, context.getPackageName());
持つリソースを取得することができます。
このライブラリプロジェクトリソースのRファイルが正しく生成されていないとRのpackageNameは、図書館プロジェクトで必要とされるのpackageNameと一致しなかった場合に発生ます。
使用方法は、user558185の答えと同じですが、それはネイティブのAndroidメソッドを使用します。
こんにちは、私はこれが遅い応答であると思いますが、それでも私はちょうどAARについて何を知らせるために、
Androidのアーカイブ - 。このファイルは、あなたの解像度とマニフェストファイルを保持することができますので、他の開発ということだけで自分のプロジェクトにAARをインポートし、そのコードをコンパイルすることができます。
この方法で我々は、マニフェストのマージエラーが発生する可能性があります、それは使用するための修正があなたのマニフェストに財産を交換し、これは、配布前にチェックする必要があります。
あなたが実装するクラス(ユーザー)からR値を取得するために抽象化を使用することができます。
protected abstract void getMyLayoutTextBox(int myLayoutTextBox);
次に、ユーザは、(Activity
を拡張する)あなたのクラスを拡張し、このメソッドを実装する必要があります。あなたのクラスでは、あなただけのgetMyLayoutTextBox()
を呼び出すと、彼はあなたの配布jarファイルを実装した後、あなたは、ユーザーから提供された正しいR値を持っています。
あなたはより多くの抽象こちらについて読むことができます。
Eclipseを使用している場合は、プロジェクトに移動します "Properties->Java Build Path"
. 。タブの下 "Source"
, 、パックしたい res フォルダーを追加します (例えば。解像度/生).
次の行が .classpath
ファイル
<classpathentry kind="src" path="res/raw"/>
ビルドが完了すると、新しい jar ファイルには以下のファイルが含まれます。 res/raw/
フォルダ。次のようにアクセスできます。 ユーザー558185 と提案した。