Android, obtenir l’ID de ressource de la chaîne?

Je dois transmettre un identifiant de ressource à une méthode dans l’une de mes classes. Il doit utiliser à la fois l’identifiant auquel la référence pointe et la chaîne. Comment devrais-je mieux y parvenir?

Par exemple:

R.drawable.icon 

Je dois obtenir l’identifiant entier de ceci, mais j’ai également besoin d’accéder à la chaîne “icon”.

Il serait préférable que tout ce que je devais passer à la méthode soit la chaîne “icon”.

@EboMike: Je ne savais pas que Resources.getIdentifier() existait.

Dans mes projets, j’ai utilisé le code suivant pour faire cela:

 public static int getResId(Ssortingng resName, Class c) { try { Field idField = c.getDeclaredField(resName); return idField.getInt(idField); } catch (Exception e) { e.printStackTrace(); return -1; } } 

Il serait utilisé comme ceci:

 getResId("icon", Drawable.class); 

Je viens de trouver un article de blog disant que Resources.getIdentifier() est plus lent que d’utiliser la reflection comme je l’ai fait. Check it out .

Vous pouvez utiliser cette fonction pour obtenir l’ID de la ressource.

 public static int getResourceId(Ssortingng pVariableName, Ssortingng pResourcename, Ssortingng pPackageName) { try { return getResources().getIdentifier(pVariableName, pResourcename, pPackageName); } catch (Exception e) { e.printStackTrace(); return -1; } } 

Donc, si vous voulez obtenir pour une fonction d’appel dessinable comme ça

 getResourceId("myIcon", "drawable", getPackageName()); 

et pour la chaîne, vous pouvez l’appeler comme ça

 getResourceId("myAppName", "ssortingng", getPackageName()); 

Lis ça

Ceci est basé sur la réponse de @Macarse.

Utilisez ceci pour obtenir l’ID des ressources plus rapidement et en respectant le code.

 public static int getId(Ssortingng resourceName, Class c) { try { Field idField = c.getDeclaredField(resourceName); return idField.getInt(idField); } catch (Exception e) { throw new RuntimeException("No resource ID found for: " + resourceName + " / " + c, e); } } 

Exemple:

 getId("icon", R.drawable.class); 

Comment obtenir un ID de ressource d’ application à partir du nom de ressource est une question assez courante et bien remplie.

Comment obtenir un identifiant de ressource Android natif à partir du nom de la ressource est moins bien traité. Voici ma solution pour obtenir une ressource Android pouvant être dessinée par nom de ressource:

 public static Drawable getAndroidDrawable(Ssortingng pDrawableName){ int resourceId=Resources.getSystem().getIdentifier(pDrawableName, "drawable", "android"); if(resourceId==0){ return null; } else { return Resources.getSystem().getDrawable(resourceId); } } 

La méthode peut être modifiée pour accéder à d’autres types de ressources.

Vous pouvez utiliser Resources.getIdentifier() , même si vous devez utiliser le format de votre chaîne lorsque vous l’utilisez dans vos fichiers XML, à savoir package:drawable/icon .

Si vous avez besoin de coupler une chaîne et un int, alors qu’en est-il d’une carte?

 static Map icons = new HashMap(); static { icons.add("icon1", R.drawable.icon); icons.add("icon2", R.drawable.othericon); icons.add("someicon", R.drawable.whatever); } 

J’ai fait comme ça, ça marche pour moi:

  imageView.setImageResource(context.getResources(). getIdentifier("drawable/apple", null, context.getPackageName())); 

Un moyen simple d’obtenir l’ID de ressource d’une chaîne. Ici, resourceName est le nom de la ressource ImageView dans le dossier pouvant être dessiné qui est également inclus dans le fichier XML.

 int resID = getResources().getIdentifier(resourceName, "id", getPackageName()); ImageView im = (ImageView) findViewById(resID); Context context = im.getContext(); int id = context.getResources().getIdentifier(resourceName, "drawable", context.getPackageName()); im.setImageResource(id); 

Puisque vous avez dit que vous ne vouliez passer qu’un seul paramètre et que cela ne semblait pas important, vous pouvez passer l’identificateur de ressource et ensuite trouver le nom de la chaîne, donc:

 Ssortingng name = getResources().getResourceEntryName(id); 

Cela pourrait être le moyen le plus efficace d’obtenir les deux valeurs. Vous n’avez pas à vous soucier de ne trouver que la partie “icône” d’une chaîne plus longue.

Dans MonoDroid / Xamarin.Android, vous pouvez faire:

  var resourceId = Resources.GetIdentifier("icon", "drawable", PackageName); 

Mais depuis GetIdentifier, ce n’est pas recommandé dans Android – vous pouvez utiliser Reflection comme ceci:

  var resourceId = (int)typeof(Resource.Drawable).GetField("icon").GetValue(null); 

où je suggère de mettre un essai / attraper ou de vérifier les chaînes que vous passez.

 public int getDrawableName(Context ctx,Ssortingng str){ return ctx.getResources().getIdentifier(str,"drawable",ctx.getPackageName()); } 

Pour obtenir l’identifiant Drawable du nom de la ressource Ssortingng, j’utilise ce code:

 private int getResId(Ssortingng resName) { int defId = -1; try { Field f = R.drawable.class.getDeclaredField(resName); Field def = R.drawable.class.getDeclaredField("transparent_flag"); defId = def.getInt(null); return f.getInt(null); } catch (NoSuchFieldException | IllegalAccessException e) { return defId; } } 

Dans votre res / layout / my_image_layout.xml

     

Pour saisir cette ImageView par sa valeur @ + id, dans votre code java, procédez comme suit:

 Ssortingng row = "0"; Ssortingng column= "7"; Ssortingng tileID = "row_" + (row) + "_col_" + (column); ImageView image = (ImageView) activity.findViewById(activity.getResources() .getIdentifier(tileID, "id", activity.getPackageName())); /*Bottom code changes that ImageView to a different image. "blank" (R.mipmap.blank) is the name of an image I have in my drawable folder. */ image.setImageResource(R.mipmap.blank);