Domanda

sto lavorando su un codice riutilizzabile Android che vorrei distribuire ad altri sviluppatori per l'utilizzo all'interno delle proprie applicazioni. Il codice ha alcune dipendenze delle risorse (layout, XML e drawable PNG) che mi piacerebbe essere in grado di includere e di riferimento all'interno di un unico pacchetto (file Jar).

Questo è possibile, e in caso affermativo qual è il metodo migliore per fare questo?

È stato utile?

Soluzione

Non ho alcuna notizia ottimista per voi. In generale, non è possibile distribuire il proprio pacchetto facilmente come ci si aspetterebbe. Il problema principale è il file R generato automaticamente. Probabilmente fare alcuni riferimenti ad esso - hai il tuo layout e drawable. Utente della libreria avrà il proprio file R - che contiene gli ID per le sue risorse, non per quelli la libreria fornisce.

In caso di risorse disegnabili li poteva leggere in modo classico, senza file di R. Ma per quanto ne so che non sono in grado di gonfiare i layout da file XML esterno.

Così il brutto hack qui sarebbe per distribuire la libreria insieme a tutte le vostre risorse, che l'utente avrebbe dovuto copiare per la propria cartella "res". Per essere onesti, non c'è una buona soluzione al vostro problema ... mi dispiace. Saluti!

Altri suggerimenti

Dal momento che Android rende la classe R automaticamente i file di risorse nella cartella /res, utilizzando la classe R come final static è impossibile.

Ho trovato una bella soluzione per utilizzare un file jar con i file res. Ecco come ho fatto:

  1. Nel codice di origine che verrà esportato nel file jar, Non utilizzare variabile R perché sarà sostituito con un indirizzo di memoria statica finale in fase di compilazione. Invece di usare R, ho fatto il mio proprio metodo di seguito:

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

    Per esempio, se si dispone di un layout con nome main.xml, si può ottenere chiamando il metodo:

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

    Se si dispone di una stringa il cui id è "testo1", si può ottenere con il metodo chiamando

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

    Questo metodo ti dà il tuo ID di risorsa in fase di esecuzione. Si utilizza l'API di riflessione per ottenere lo status di R in fase di esecuzione.

    Utilizzando questo metodo è possibile evitare di utilizzare la variabile R.

  2. Copiare i file res al progetto di destinazione.

  3. Genera.


layout:

codice rigido nella vostra sorgente di Java


& xml png:

copia XML e png nella cartella src del progetto e pacchetto per vaso, ad esempio

copiare a.png a src / com / es / test

caricarlo come segue codici Java:

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

Ho appena scoperto che lo strumento aapt nel SDK di Android permette la seguente opzione:

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

Questo sembra promettente, anche se non ho provato questo quindi non ho la più pallida idea se funziona. Ho il sospetto che questo è quello di aggirare il problema risolto dalla @ di J.J.Kim post di cui sopra.

È possibile ottenere in modo dinamico risorsa id usando il metodo di Android.

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

In seguito le risorse devono essere inclusi (copiato) al nuovo progetto.

user558185 soluzione, ma qui è un modo più semplice. Se voi le risorse si trova in un progetto di libreria (per un Plugin Cordova, per esempio), è possibile ottenere risorse con context.getResources().getIdentifier(name, className, context.getPackageName());

Questo accade quando il file R biblioteca di risorse del progetto non viene generato correttamente e il R packageName non corrisponde alla packageName richiesto dal Progetto Biblioteche.

L'utilizzo è la stessa risposta user558185, ma usa un metodo nativo Android.

Ciao io credo che questo sia una risposta in ritardo, ma ancora ho proprio quello di informare sulle AAR

archivio Android -. Questo file può contenere i vostri res e file manifesto, in modo che l'altro si sviluppano può semplicemente importare l'AAR al loro progetto e compilare il loro codice

In questo modo potremmo ottenere manifesto unire gli errori, la correzione per in modo da utilizzare sostituire la proprietà nel vostro manifesto e questo deve essere controllato prima della distribuzione.

è possibile utilizzare l'astrazione per ottenere i valori di R dalla classe che implementa (l'utente).

protected abstract void getMyLayoutTextBox(int myLayoutTextBox);

Quindi l'utente deve estendere la classe (che si estende Activity), e implementare questo metodo. Nella tua classe, basta chiamare getMyLayoutTextBox() e avrete il valore di R corretto fornito dall'utente dopo che implementa vostro vaso distribuibile.

Si può leggere di più su astrazione qui .

Se si utilizza Eclipse, andare a proiettare "Properties->Java Build Path". Nella scheda "Source", aggiungono le res cartella che si desidera mettere in valigia (per es. Res / raw) .

Si aggiungerà la seguente riga nel file .classpath
    

Dopo aver costruito fatto, il nuovo file jar conterrà i file nella cartella res/raw/. È possibile accedere a loro come user558185 suggerito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top