配布可能な Jar ファイル内に Android リソース ファイルをパッケージ化する 質問する

配布可能な Jar ファイル内に Android リソース ファイルをパッケージ化する 質問する

私は、他の開発者に配布して各自のアプリケーション内で使用してもらうために、再利用可能な Android コードを作成中です。コードにはリソース依存関係 (レイアウト、xml および png 描画可能ファイル) がいくつかあり、これらを単一のパッケージ (Jar ファイル) 内に含めて参照できるようにしたいと考えています。

これは可能でしょうか?可能であれば、これを行うための最良の方法は何ですか?

ベストアンサー1

RAndroid はフォルダ下のリソースファイルで自動的にクラスを作成するため/resRクラスをそのまま使用することfinal 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");
    

    「text1」という文字列がある場合id、メソッドを呼び出すことで取得できます。

    int id = getResourceIdByName(context.getPackageName(), "string", "text1");
    

    Rこのメソッドは実行時にリソース ID を提供します。実行時のステータスを取得するためにリフレクション API を使用します。

    この方法を使用すると、変数の使用を回避できますR

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

  3. 建てる。

おすすめ記事