Frage

Ich arbeite an einigen wiederverwendbares Android Code, dass ich für die Verwendung in ihren eigenen Anwendungen auf andere Entwickler verteilen möchten. Der Code hat einige Ressourcenabhängigkeiten (Layouts, xml & png Drawables), dass ich mag in der Lage sein, zu schließen und Referenz in einem einzigen Paket (Jar-Datei).

Ist das möglich ist, und wenn ja, was ist die beste Methode, dies zu tun?

War es hilfreich?

Lösung

Ich habe keine optimistischen Nachrichten für Sie. In der Regel können Sie Ihr eigenes Paket nicht verteilt so leicht, wie man erwarten würde. Das Hauptproblem ist die automatisch generierte R-Datei. Sie machen wahrscheinlich einige Hinweise darauf - Sie Ihre Layouts und Drawables haben. Benutzer Ihrer Bibliothek wird seine eigene R-Datei - enthält IDs für seine Ressourcen, nicht für die, die Ihre Bibliothek zur Verfügung stellt.

Im Fall von ziehbar Ressourcen könnte man sich in klassischen Art und Weise, ohne R-Datei lesen. Aber soweit ich weiß, Sie nicht in der Lage ist aufzublasen Layouts von einem externen XML-Dateien.

Also das hässliche Hack hier wäre die Bibliothek zusammen mit allen Ressourcen zu verteilen, die Benutzer auf seine „res“ Ordner zu kopieren haben würden. Um ehrlich zu sein, gibt es keine gute Lösung für Ihr Problem ... sorry. Viele Grüße!

Andere Tipps

Da Android macht die R Klasse automatisch mit Ressourcendateien unter dem /res Ordner mit der R Klasse als final static unmöglich ist.

fand ich eine schöne Lösung eine jar Datei mit den res Dateien zu verwenden. Hier ist, wie ich es getan hätte:

  1. In Ihrem Quellcode, die in der jar-Datei exportiert werden, nicht verwenden R variabel, da es mit einer endgültigen statischer Speicheradresse in der Kompilierung ersetzt werden. Statt R zu verwenden, ich meine eigene Methode unten gemacht:

    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;
    }
    

    Zum Beispiel, wenn Sie ein Layout namens main.xml haben, können Sie es erhalten, indem die Methode aufrufen:

    int id = getResourceIdByName(context.getPackageName(), "layout", "main");
    

    Wenn Sie eine Zeichenfolge, deren id haben ist „text1“, Sie können es durch Aufruf der Methode

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

    Diese Methode gibt Ihnen Ihre Ressource-ID zur Laufzeit. Es nutzt den Reflection-API den Status R zur Laufzeit zu erhalten.

    Mit dieser Methode können Sie die R Variable vermeiden verwenden.

  2. Kopieren Sie Ihre res Dateien auf Ihrem Zielprojekt.

  3. Erstellen.


Layouts:

Fest Code in Ihrer Java-Quelle


xml & png:

Kopieren xml & png zu einem Projekt src Ordnern und Paket zu Glas, zum Beispiel

Kopieren a.png auf src / com / example / test

laden Sie es wie folgt Java-Codes:

    InputStream is = YourClassName.class.getClassLoader().getResourceAsStream("com/example/test/a.png");
    if ( null != is )
    {
          Bitmap bmp = BitmapFactory.decodeStream(is);

Ich fand nur, dass das aapt Tool im Android SDK die folgende Option können:

   --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.

Das klingt vielversprechend, obwohl ich nicht versucht habe, so dass ich keine Ahnung, ob es funktioniert. Ich vermute, dass dies das Problem durch @ J.J.Kim der Beitrag oben gerichtet zu umgehen ist.

Sie können dynamisch Ressourcen-ID mit Android-Methode erhalten.

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

Später haben Sie Ihre Ressourcen auf Ihr neues Projekt eingebunden (kopiert) werden.

Ich war mit user558185 Lösung, aber hier ist ein einfacher Weg. Wenn Sie Ressourcen in einem Bibliotheksprojekt (für ein Cordova Plugin zum Beispiel) sind, können Sie Ressource mit context.getResources().getIdentifier(name, className, context.getPackageName()); bekommen

Dies geschieht, wenn die Bibliothek Projektressourcen R Datei nicht richtig erzeugt wird und die R package hat die erforderliche package durch das Bibliotheksprojekt nicht überein.

Die Verwendung ist die gleiche wie user558185 Antwort, aber sie verwenden eine native Android-Methode.

Hallo, Ich denke, das ist eine späte Antwort, aber immer noch ich genau das, was über AAR

informieren

Android ARchive -. Diese Datei kann Ihre res und Manifest-Dateien halten, so dass die andere entwickeln können nur die aar zu ihrem Projekt importieren und dessen Code kompilieren

So können wir Manifest merge Fehler bekommen könnten, das Update für das Objekt in Ihrem Manifest zu verwenden, ersetzen und dies soll vor der Verteilung überprüft werden.

Sie können Abstraktion verwenden, um den R-Wert von der implementierenden Klasse zu erhalten (der Benutzer).

protected abstract void getMyLayoutTextBox(int myLayoutTextBox);

Dann hat der Benutzer Ihre Klasse zu erweitern (die Activity erstreckt), und diese Methode zu implementieren. In Ihrer Klasse, rufen Sie einfach getMyLayoutTextBox() und Sie den richtigen R-Wert durch den Benutzer geliefert haben, nachdem er Ihr verteilbare Glas implementiert.

Sie können lesen Sie mehr über Abstraktion hier .

Wenn Sie Eclipse verwenden, gehen Sie zu Projekt "Properties->Java Build Path". Unter Registerkarte "Source", fügen Sie die res Ordner, den Sie packen wollen (z. Res / raw) .

Es wird die folgende Zeile in die Datei .classpath
hinzufügen     

Nach dem Bau fertig, die neue JAR-Datei werden die Dateien in res/raw/ Ordner enthalten. Sie können auf sie zugreifen, wie user558185 vorgeschlagen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top