Question

Je travaille sur un code Android réutilisable que je voudrais distribuer à d'autres développeurs à utiliser dans leurs propres applications. Le code a des dépendances de ressources (mise en page, xml et dessinables png) que je voudrais être en mesure d'inclure et de référence dans un seul paquet (fichier Jar).

Est-ce possible, et si oui, quelle est la meilleure méthode pour le faire?

Était-ce utile?

La solution

Je n'ai pas de nouvelles optimistes pour vous. En général, vous ne pouvez pas distribuer votre paquet aussi facilement que vous attendez. Le principal problème est le fichier autogenerated R. Vous probablement faire quelques références à - vous avez vos mises en page et dessinables. L'utilisateur de votre bibliothèque aura son propre fichier R - contenant ids pour ses ressources, et non pas pour ceux de votre bibliothèque fournit.

Dans le cas des ressources étirables, vous pouvez les lire de manière classique, sans fichier R. Mais pour autant que je sais que vous n'êtes pas en mesure de gonfler mises en page à partir de fichiers XML externes.

Alors le hack laid ici serait de distribuer votre bibliothèque ainsi que toutes vos ressources, l'utilisateur aurait à copier dans son dossier « res ». Pour être honnête, il n'y a pas de bonne solution à votre problème ... désolé. Cordialement!

Autres conseils

Depuis Android fait la classe R automatiquement les fichiers de ressources dans le cadre du dossier /res, en utilisant la classe R comme final static est impossible.

J'ai trouvé une solution agréable à utiliser un fichier jar avec les fichiers res. Voici comment je l'ai fait:

  1. Dans votre code source qui sera exportée dans le fichier jar, ne pas utiliser variable R car elle sera remplacée par une adresse mémoire statique finale dans le temps de la compilation. Au lieu d'utiliser R, j'ai fait ma propre méthode ci-dessous:

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

    Par exemple, si vous avez une mise en page nommée main.xml, vous pouvez l'obtenir en appelant la méthode:

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

    Si vous avez une chaîne dont id est « text1 », vous pouvez l'obtenir par la méthode appelant

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

    Cette méthode vous donne votre identifiant de ressource lors de l'exécution. Il utilise l'API de réflexion pour obtenir le statut de R lors de l'exécution.

    En utilisant cette méthode, vous pouvez éviter d'utiliser la variable R.

  2. Copiez vos fichiers res à votre projet cible.

  3. Générer.


mises en page:

dur dans le code source java


xml et .png:

xml copier et .png dans votre dossier de projet et src package Jar, par exemple

copie a.png src / com / exemple / test

charger comme suivant codes Java:

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

Je viens de découvrir que l'outil de aapt dans le SDK Android permet l'option suivante:

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

Cela semble prometteur, bien que je ne l'ai pas essayé donc je n'ai pas la moindre idée si cela fonctionne. Je soupçonne que c'est de contourner le problème abordé par le poste de @ J.J.Kim ci-dessus.

Vous pouvez dynamiquement obtenir id ressource en utilisant la méthode Android.

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

Plus tard vos ressources doivent être inclus (copié) à votre nouveau projet.

J'utilisais solution user558185 mais voici une façon plus simple. Si les ressources vous est dans un projet de bibliothèque (pour un plug-in Cordova par exemple), vous pouvez obtenir des ressources avec context.getResources().getIdentifier(name, className, context.getPackageName());

se produire lorsque les ressources du projet de bibliothèque fichier R n'est pas généré correctement et la R packageName ne correspond pas au packageName requis par le projet de bibliothèque.

L'utilisation est le même que la réponse de user558185, mais il utilise une méthode native Android.

Salut je pense que cela est une réponse tardive mais je viens de quoi informer AAR

Android ARchive -. Ce fichier peut contenir vos fichiers res et manifestes, de sorte que l'autre peut développer simplement importer le AAR à leur projet et compiler leur code

De cette façon, nous pourrions obtenir Manifest fusionner des erreurs, le correctif pour remplacer pour utiliser la propriété dans votre manifeste et cela doit être vérifié avant la distribution.

vous pouvez utiliser l'abstraction pour obtenir les valeurs R de la classe d'exécution (de l'utilisateur).

protected abstract void getMyLayoutTextBox(int myLayoutTextBox);

Ensuite, l'utilisateur doit étendre votre classe (qui étend Activity), et mettre en œuvre cette méthode. Dans votre classe, vous appelez simplement getMyLayoutTextBox() et vous aurez la valeur R correcte fournie par l'utilisateur après qu'il met en œuvre votre pot distribuables.

Vous pouvez en savoir plus sur abstraction .

Si vous utilisez Eclipse, allez projeter "Properties->Java Build Path". Sous l'onglet "Source", ajoutez la résolution dossier que vous voulez emballer (par exemple. Res / raw) .

Il ajoutera la ligne suivante dans le fichier .classpath
    

Après la construction fait, le nouveau fichier jar contiendra les fichiers dans le dossier res/raw/. Vous pouvez y accéder comme le suggère user558185 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top