48

私は、他の開発者が独自のアプリケーション内で使用できるように配布したい、再利用可能な Android コードに取り組んでいます。コードには、1 つのパッケージ (Jar ファイル) に含めて参照できるようにしたいリソースの依存関係 (レイアウト、xml、png ドローアブル) がいくつかあります。

これは可能ですか?もしそうなら、これを行うための最良の方法は何ですか?

4

9 に答える 9

55

AndroidはフォルダR配下のリソースファイルでクラスを自動生成するため、クラスをそのまま利用することはできません。/resRfinal static

jarファイルでファイルを使用する良い解決策を見つけましたres。これが私がやった方法です:

  1. 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変数の使用を避けることができます。

  2. resファイルをターゲット プロジェクトにコピーします。

  3. 建てる。

于 2011-08-19T05:45:23.367 に答える
26

楽観的なニュースはありません。一般に、独自のパッケージを期待するほど簡単に配布することはできません。主な問題は、自動生成された R ファイルです。おそらく、いくつかの参照を作成します-レイアウトとドローアブルがあります。ライブラリのユーザーは、ライブラリが提供するものではなく、リソースの ID を含む独自の R ファイルを持ちます。

ドローアブル リソースの場合、R ファイルを使用せずに従来の方法で読み取ることができます。しかし、私が知る限り、外部の xml ファイルからレイアウトを膨らませることはできません。

したがって、ここでの醜いハックは、ライブラリをすべてのリソースと一緒に配布することであり、ユーザーはそのリソースを自分の「res」フォルダーにコピーする必要があります。正直なところ、あなたの問題に対する良い解決策はありません...申し訳ありません。よろしく!

于 2010-01-03T14:10:23.307 に答える
20

レイアウト:

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);
于 2010-12-30T10:56:00.210 に答える
4

aaptAndroid 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 の投稿で対処された問題を回避するためだと思われます。

于 2012-04-27T21:57:58.203 に答える
3

Android メソッドを使用してリソース ID を動的に取得できます。

int preferences = context.getResources().getIdentifier("preferences", "xml", context.getPackageName());

後で、リソースを新しいプロジェクトに含める (コピーする) 必要があります。

于 2012-09-27T11:51:27.480 に答える
1

こんにちは、これは遅い応答だと思いますが、それでも AAR について何を通知するかだけです

Android ARchive - このファイルには res ファイルとマニフェスト ファイルを保持できるため、他の開発者は aar をプロジェクトにインポートしてコードをコンパイルできます。

この方法では、マニフェストのマージ エラーが発生する可能性があります。マニフェストで置換プロパティを使用するための修正であり、これは配布前に確認する必要があります。

于 2016-03-10T14:46:34.173 に答える
1

私はuser558185ソリューションを使用していましたが、もっと簡単な方法があります。リソースがライブラリ プロジェクト (Cordova プラグインなど) にある場合は、次のコマンドでリソースを取得できます。context.getResources().getIdentifier(name, className, context.getPackageName());

これは、ライブラリ プロジェクト リソースの R ファイルが正しく生成されず、R packageName がライブラリ プロジェクトで必要な packageName と一致しなかった場合に発生します。

使い方はuser558185の回答と同じですが、ネイティブのAndroidメソッドを使用しています。

于 2015-04-10T15:22:21.790 に答える
0

抽象化を使用して、実装クラス (ユーザー) から R 値を取得できます。

protected abstract void getMyLayoutTextBox(int myLayoutTextBox);

次に、ユーザーはクラスを拡張し (これは を拡張しますActivity)、このメソッドを実装する必要があります。あなたのクラスでは、呼び出すだけでgetMyLayoutTextBox()、ユーザーが配布可能な jar を実装した後、正しい R 値が提供されます。

抽象化の詳細については、こちらを参照してください。

于 2011-08-19T14:12:21.863 に答える
0

Eclipse を使用している場合は、 project に移動します"Properties->Java Build Path"。タブ"Source"の下に、圧縮したい res フォルダーを追加します(例: res/raw)

.classpath次の行をファイル<classpathentry kind="src" path="res/raw"/>に追加します

ビルドが完了すると、新しい jar ファイルにはフォルダー内のファイルが含まれres/raw/ます。user558185が提案したように、それらにアクセスできます。

于 2015-01-06T08:15:30.023 に答える