7
votes

Comment faire référence à une chaîne d'un autre package dans une bibliothèque utilisant XML dans Android?

L'Android Documentation me dit que je peux accéder à un chaîne d'un autre paquet en utilisant le "nom du package", quoi que cela signifie: xxx

donc dans mon manifeste, je veux accéder à une chaîne que j'ai placée dans un projet de bibliothèque distincte, dans le com.globalmentor.android package --- C'est là que ma classe r est, après tout: xxx

qui ne fait pas 't même compiler. Mais cela fait: xxx

pourquoi? Qu'est-ce que la documentation Android signifie qu'il parle du "nom de paquet"? Pourquoi le premier exemple ne fonctionne-t-il pas et pourquoi le deuxième exemple fonctionne-t-il? Je ne veux pas que tous mes noms de ressources fusionnés dans le même fichier r --- Je veux qu'ils soient partitionnés dans des packages, comme je les ai écrites.


0 commentaires

5 Réponses :


1
votes

Si vous l'aimez ou non, les ressources du projet de bibliothèque sont fusionnées dans les ressources du projet d'application, des ressources avec le même nom du projet d'application, qui remplacent ceux des projets de bibliothèque. Regardez le fichier R.java dans le projet d'application pour confirmer.

Vous pouvez accéder aux ressources-cadres exportées publiquement en utilisant @android: String / FOO ("Android" paquet), mais je ne pense pas que vous puissiez exporter des ressources d'un projet de bibliothèque comme celui-ci (encore ).


2 commentaires

Sérieusement? Quel est le point d'avoir com.myapp.r et com.library.r si tous les noms sont toujours clash? Donc, je dois utiliser com.example.foo.r.id.com_example_foo_bar au lieu de com.example.foo.r.id.bar juste pour conserver les noms d'affichage quand ils se fusionnent? Quel étourdi.


Donc, aucune idée de la documentation signifie quand elle dit "Package_Name" (voir la question originale)?



4
votes

En bref: le préfixe de nom de package est destiné aux bibliothèques partagées, pas pour votre APK.

La documentation se lit comme suit:

Pour référencer une ressource System , vous aurez besoin d'inclure le nom du package

Ceci correspond aux bibliothèques partagées externes (et à leurs ressources), votre demande est liée contre (par exemple les cartes). Ils ont leur propre classe R, non fusionné avec celle de votre application.

Ce sont tous des packages Android standard et des bibliothèques partagées que vous avez mentionnées dans la section du manifeste Android.

Comme Nikolay a souligné, toutes les ressources de l'application sont fusionnées, c'est pourquoi les projets de la bibliothèque majoritaire utilisent des préfixes telles que ABS__ pour leurs noms de ressources.

voir Projets de la bibliothèque Doc pour plus d'informations.


0 commentaires

2
votes

Pourquoi?

Parce que vous avez ajouté ce projet de bibliothèque à votre projet, Android fusionne ainsi les ressources, le dernier projet construit "gagne" le nom. Pour cette raison, c'est une bonne idée de préfixer les ressources. Dans ce cas, le «nom de paquet» ne peut pas être utilisé car vous avez ces ressources dans votre propre projet. J'imagine que c'est votre cas car il compile sans le nom du paquet.

Si vous n'avez pas ce projet de bibliothèque ajouté à votre projet, une solution possible consiste à utiliser Shareduserid.

Source: http://developer.android.com/tools/projects/index. HTML

Considérations de développement

Lorsque vous développez votre projet de bibliothèque et vos applications dépendantes, gardez Les points énumérés ci-dessous à l'esprit:

  • conflits de ressources car les outils fusionnent les ressources d'un projet de bibliothèque avec celles d'un projet d'application à charge, une donnée L'ID de ressource pourrait être défini dans les deux projets. Dans ce cas, les outils Sélectionnez la ressource à partir de l'application ou de la bibliothèque avec le plus haut priorité et jetez l'autre ressource. Comme vous développez votre les candidatures sont conscientes que les ID de ressources courantes sont susceptibles d'être défini dans plus d'un projet et sera fusionné, avec la ressource de l'application ou la bibliothèque la plus prioritaire prenant la priorité.
  • Utilisez des préfixes pour éviter les conflits de ressources pour éviter les conflits de ressources pour les ID de ressources courantes, envisagez d'utiliser un préfixe ou un autre cohérent. schéma de dénomination unique au projet (ou est unique sur tout projets).

0 commentaires

0
votes

Nommez votre ressource dans votre package comme com.globalmentor.android.app_aplicationListactivity_lab et non seulement app_applicationlistactivity_lab.

.... ...
....

alors vous pouvez y accéder à partir de XML comme

"@ string / com.globalmentor.android.app_applylistactivity_lab"

et programmatiquement par

getresources (). getString (r.string.com_globalmentor_android_app_aplicationlistactivity_lab);

sans conflits.


0 commentaires

0
votes

Vous devez d'abord ajouter une dépendance du premier package (avec vos chaînes) à votre deuxième package

 Entrez la description de l'image ici

Ensuite, allez à votre deuxième package Strings.xml Fichier pour déclarer vos chaînes

 Entrez la description de l'image ici

Ensuite, vous pouvez appeler des chaînes de manière programmatique à partir de votre premier colis

appelez une piqûre de manière programmative

 Entrez la description de l'image ici


0 commentaires