2011-08-11 9 views
2

J'ai une image appelée (my_image.png) dans mon dossier Drawable-mdpi.Comment obtenir le Resource.Id de Value?

mon application android interagit avec un webservice. Il pourrait renvoyer "my_image". Mon application Android devrait charger cette image.

Je me sers MonoDroid et moi avons essayé cette

int abc = Resources.GetIdentifier("my_image","drawable",null); 

Pourtant, le résultat est toujours "0". Quand il doit être (à partir du fichier de ressources)

 // aapt resource value: 0x7f020000 
     public const int my_image = 2130837504; 

En regardant autour et la façon dont Android semble être similaire

int i = this.getResources().getIdentifier("txt_asecondtext", "strings", this.getPackageName()); 

J'ai essayé en passant le nom du paquet au lieu de null mais qui n'a rien fait.

+0

Je crois avoir compris pourquoi votre dernier exemple de ligne ne fonctionne pas. 'strings' devrait être' string' – gtcompscientist

Répondre

5

Le problème est double:

  1. Vous avez besoin pour fournir un nom de package dans l'appel Resources.GetIdentifier() et n'utilisez pas null.
  2. Vous devez utiliser le nom de package correct.

La façon simple de vous assurer d'obtenir le nom du package correct est d'utiliser la propriété Android.Content.Context.PackageName:

int id = Resources.GetIdentifier ("my_image", "drawable", PackageName); 

Si vous ne voulez pas/ne peut pas utiliser Context.PackageName, puis regardez à la construction sortie, par exemple le fichier obj\Debug\android\AndroidManifest.xml et utilisez la valeur de l'attribut /manifest/@package.Par exemple, AndroidManifest.xml peut contenir:

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:versionCode="1" 
     android:versionName="1.0" 
     package="MonoAndroidApplication2.MonoAndroidApplication2"> 
    <!-- ... --> 
</manifest> 

Ainsi, vous pouvez utiliser à la place:

int id = Resources.GetIdentifier ("my_image", "drawable", 
     "MonoAndroidApplication2.MonoAndroidApplication2"); 

Pour [email protected] abonnés, voir le fil How to use Resources.GetIdentifier() et le followup message.

+0

J'ai trouvé que l'utilisation d'un nom de paquet comme vous l'avez fait ("MonoAndroidApplication2.MonoAndroidApplication2") ne fonctionnait pas. J'ai dû le changer deux sous-chaînes différentes, par exemple: "MonoForAndroid.MonoAndroidApplication2" –

+0

Que faire si j'ai besoin d'accéder à quelque chose comme 'com.android.internal.R.string.ime_action_done'? –

3

Vous avez juste besoin de formater votre demande correctement:

Au lieu de:

int i = this.getResources().getIdentifier("txt_asecondtext", "strings", this.getPackageName()); 

Essayez:

int i = getResources().getIdentifier("[fully qualified package]:drawable/[resource name]", null, null); 

Donc, pour Resource "com.example" "mon_image" dans le paquet, il ressemblerait à:

int i = getResources().getIdentifier("com.example:drawable/my_image", null, null); 

MISE À JOUR: J'ai aussi testé que les travaux suivants me forment (y compris les lignes de journaux qui le prouvent:

int i = getResources().getIdentifier(
    getPackageName() + ":drawable/" + resource_name, null, null); 
Log.d("EXAMPLE", "Just making sure that these IDs match: '" + i + "' == '" + R.drawable.resource_name + "'."); 

Cela peut aussi être formaté comme vous l'avez fait ci-dessus, que je crois que je l'ai signalé votre erreur: int i = getResources(). GetIdentified (nom_ressource, "drawable", getPackageName());

+0

Non cela ne semble avoir rien fait. Toujours obtenir zéro imprimé. – chobo2

+0

Je viens de tester cela dans mon propre code et cela a fonctionné, alors assurons que nous l'ayons configuré de la même manière. Pouvez-vous mettre à jour votre question avec la ligne que vous essayez maintenant? – gtcompscientist

+1

Assurez-vous de ne pas utiliser "Resources.getSystem(). GetIdentifier (nom, defType, defPackage)" mais utilisez l'objet Resources du contexte actuel. –

1

Pour une ressource de chaîne que je fais comme ceci:

String s = "nameToFetch"; 
String text = getString(getResources().getIdentifier("str_" + s, "string", getPackageName())); 

Je pense donc que pour votre drawable vous devez appeler:

String s = "nameToFetch"; 
Drawable drawable = getDrawable(getResources().getIdentifier("d_" + s, "drawable", getPackageName())); 
Questions connexes