Comment obtenir le nom de la ressource à partir de l'ID de ressource

158


Dans ma mise en page, j'ai défini quelque chose comme ça.

<RadioButton
    android:id="@+id/radio1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Dnt want this text" />

Supposons qu'une fonction en activité me renvoie cet id (id de radioButton). Maintenant, je veux obtenir ce texte radio1 à partir de cet identifiant. En bref je veux récupérer le texte radio1 écrit enandroid:id="@+id/radio1"

Quelqu'un peut-il me dire comment est-ce possible?

Code_Life
la source
C'est une longue histoire ... j'ai besoin de remplir des données dans un grand pas de editText à partir de certaines données reçues du serveur. Donc, au lieu de définir manuellement les données sur toutes les zones de texte, j'écris une méthode qui pourrait fonctionner pour moi .. pour cela, j'en ai besoin.
Code_Life

Réponses:

363

Dans votre activité, essayez ceci:

  1. pour obtenir une chaîne comme radio1:

    getResources().getResourceEntryName(int resid);
  2. pour obtenir une chaîne comme com.sample.app:id/radio1:

    getResources().getResourceName(int resid);

Dans Kotlin Now:

val name = v.context.resources.getResourceEntryName(v.id)
Shubhayu
la source
4
Merci d'avoir répondu à cela, j'ai passé la majeure partie d'une heure à googler ce problème - le site de développement n'arrêtait pas de me pointer vers getString () - ce qui était complètement inutile pour cela.
Steve le
8
Une idée de la différence entre getResourceEntryName(int resid)et getResourceName(int resid)?
Joshua Pinter le
10
@JoshPinter la référence dit: getResourceEntryName : renvoie le nom d'entrée pour un identifiant de ressource donné getResourceName: renvoie le nom complet d'un identifiant de ressource donné. Ce nom est une seule chaîne de la forme "package: type / entrée" La différence semble alors être dans le package ajouté : type pour getResourceName
Jose_GD
@Shubhayu - comment pourriez-vous faire cela dans un test d'espresso? La fonction getResources () ne semble pas disponible!
1ak31sha
Je ne recommanderais pas de l'utiliser si vous utilisez Proguard ( minifyEnabled true), en particulier pourgetResources().getIdentifier(...
user25
9

Vous avez l' ID (type 'long') de cet identifiant que vous souhaitez accéder au bouton radio id (nom) qui est radio1 . Vous utilisez ceci

getResources().getResourceEntryName(id);

en utilisant ci-dessus, vous pouvez obtenir le nom du bouton radio ie radio1. ici le paramètre id est celui que vous avez (type long) . Essayez ceci, cela vous aidera à 100%.

Anil Jadhav
la source
2
Je vous remercie. Heureux que quelqu'un ait réellement répondu à la question au lieu des réponses habituelles «pourquoi avez-vous besoin de cela [noob]». Avoir le nom de l'élément pendant que je suis en train de les parcourir est INVALUABLE pour le débogage. Je veux dire, vraiment, comment vais-je trouver le TextView avec l'ID 354814715? (ce qui, si je ne me trompe pas, n'est même pas constant entre les compilations) - je ne sais pas pourquoi l'OP en avait besoin, mais j'en avais besoin pour vérifier que ma fonction de mise à l'échelle de la police était en fait une itération à travers tous les sous-éléments.
Steve le
2

Kotlin:

val name = v.context.resources.getResourceEntryName(v.id)
Anand Makwana
la source
2
Peut-être que vous pouvez ajouter plus d'informations sur le problème que cela résout et comment il le fait :)
Philipp Meissner
@PhilippMeissner tout est évident
Jemshit Iskenderov
Disons que l'on n'est pas d'accord.
Philipp Meissner
1

Si j'ai raison, ce que vous vouliez récupérer est le mot "radio1" (de l'identifiant lui-même?) Donc si c'est le cas, vous devez d'abord obtenir son identifiant.

int intname= buttonname.getId();

puis obtenez le résultat

String stringname= getResources().getResourceEntryName(intname);

espéré avoir aidé

Fahad Maqsood Qazi
la source
-1

Vous voulez dire que vous voulez prendre la chaîne de texte de l'identifiant?

Puisque vous l'avez défini, vous devez savoir ce que c'est.

Si vous avez une mise en page et que vous voulez savoir si une vue a un identifiant spécifique, vous pouvez parcourir toute la mise en page et vérifier avec getId (), si l'identifiant de chaque vue est l'identifiant que vous recherchez.

J'espère que cela aide (si j'ai bien compris, corrigez votre question .. :))

Dimitris Makris
la source
Non, vous avez tout faux. Je veux récupérer le texte radio1 depuis Android: id = "@ + id / radio1"
Code_Life
Texte radio1 EST l'identifiant de votre vue. Ce n'est pas un simple texte que vous pouvez récupérer, scinder, etc. Pour mieux vous aider, pouvez-vous nous dire pourquoi exactement vous avez besoin de ce texte?
Dimitris Makris
@DimitrisMakris: C'est une longue histoire ... j'ai besoin de remplir des données dans un grand pas de editText à partir de certaines données reçues du serveur. Donc, au lieu de définir manuellement les données sur toutes les zones de texte, j'écris une méthode qui pourrait cela fonctionner pour moi .. pour cela, j'ai besoin de ceci
Code_Life
Donc, si vous avez une réponse de 10 par exemple des chaînes avec lesquelles vous voulez remplir 10 boutons radio, je pense qu'une solution pourrait être de créer dynamiquement ces boutons radio et de définir leur valeur. Une autre approche pourrait être d'utiliser un ListView avec des boutons radio comme éléments de liste, si bien sûr cela répond à vos besoins concernant la mise en page.
Dimitris Makris
Merci pour votre réponse. Mais vous vous êtes trompé, j'ai 10 editBox et je reçois comme chaîne json avec la valeur à remplir dans ces 10 editbox après que cette chaîne est analysée, elle est convertie en HashMap. Maintenant, à la place, mappez manuellement chaque valeur (correspondant à la clé de hashmap) pour modifier le texte. J'écris une méthode qui pourrait cela fonctionner pour moi.
Code_Life