web-dev-qa-db-fra.com

La clé doit être un identifiant de ressource spécifique à l'application.

Pourquoi ai-je cette exception?

05-18 20:29:38.044: ERROR/AndroidRuntime(5453): Java.lang.IllegalArgumentException: The key must be an application-specific resource id.
05-18 20:29:38.044: ERROR/AndroidRuntime(5453):     at Android.view.View.setTag(View.Java:7704)
05-18 20:29:38.044: ERROR/AndroidRuntime(5453):     at com.mypkg.viewP.inflateRow(viewP.Java:518)

la ligne en question est:

((Button) row.findViewById(R.id.btnPickContact)).setTag(TAG_ONLINE_ID,objContact.onlineid);

et je l'ai défini comme:

private static final int TAG_ONLINE_ID = 1;
140
Pentium10

L'identifiant de balise doit être unique, il doit donc être un identifiant créé dans un fichier de ressources pour garantir l'unicité.

Si la vue ne contient qu'une seule balise, vous pouvez simplement le faire.

setTag(objContact.onlineid);
53
Robby Pond

La raison pour laquelle vous ne pouvez pas utiliser setTag (int, Object) est due au fait que Android requiert un identifiant unique précompilé dans l'argument 'int'.

Essayez de créer deux entrées uniques dans String.xml XML dites: "prénom" et "deuxième nom" et utilisez-les comme ci-dessous.

imageView.setTag(R.string.firstname, "Abhishek");
imageView.setTag(R.string.lastname, "Gondalia");
219
ABDroids

Je suis un peu en retard à la fête, mais j’ai trébuché sur ce problème moi-même aujourd’hui et je pensais donner une réponse également. Cette réponse sera un peu une compilation des autres réponses, mais avec une torsion. Tout d’abord, l’identifiant, comme l’ont souligné d’autres personnes, ne peut PAS être une constante définie dans votre code (par exemple, int statique final final MYID = 123) ou tout autre entier que vous définissez comme un champ quelque part.

L'identifiant doit être un identifiant unique précompilé, comme ceux que vous obtenez pour les chaînes que vous avez insérées dans values ​​/ strings.xml (c'est-à-dire R.string.mystring). Voir http://developer.Android.com/guide/topics/resources/available-resources.html et http://developer.Android.com/guide/topics/resources /more-resources.html pour plus d'informations.

Ma suggestion est de créer un nouveau fichier appelé values ​​/ tags.xml et d'écrire:

    <resources xmlns:Android="http://schemas.Android.com/apk/res/Android">
      <item name="TAG_ONLINE_ID" type="id"/>
    </resources>

Je pense qu'il est préférable de créer un fichier séparé au lieu de le placer dans strings.xml, comme le suggère EtienneSky.

141
britzl

CELA FAIT LE TRAVAIL ...

Si vous avez juste 1 setTag dans votre classe, vous pouvez utiliser n'importe quel int, peut-être une finale statique déclarée en haut.

Le problème survient lorsque vous avez 2 settag ou plus avec des clés différentes. Je veux dire:

public static final int KEY_1 = 1;
public static final int KEY_2 = 2;
...
setTag(KEY_1)
setTag(KEY_2)
...

Ce scénario est faux. Vous devez ensuite ajouter un fichier de valeur appelé peut-être ids.xml avec les éléments suivants:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="id" name="resourceDrawable" />
    <item type="id" name="imageURI" />
</resources>

Puis, en classe, appelle:

 ...
 setTag(R.id.resourceDrawable, KEY_1)
 setTag(R.id.imageURI, KEY_2)
 ...
49
Sterling Diaz
private static final int TAG_ONLINE_ID = 1 + 2 << 24;

devrait marcher. Plus d'infos de ceph3us :

La clé spécifiée doit être un identifiant déclaré dans les ressources de l'application pour garantir sa singularité. Les clés identifiées comme appartenant au cadre Android) ou non associées à un package entraîneront la génération d'une exception IllegalArgumentException.

de la source:

public void setTag(int key, final Object tag) {
    // If the package id is 0x00 or 0x01, it's either an undefined package
    // or a framework id
    if ((key >>> 24) < 2) {
        throw new IllegalArgumentException("The key must be an application-specific "
                + "resource id.");
    }

    setKeyedTag(key, tag);
}
8
Anton Duzenko

J'ai utilisé viewHolder.itemTitleTextView.getId(). Mais vous pouvez aussi déclarer dans vos ressources: <item type="id" name="conversation_thread_id"/>

3
ViliusK

La raison pour laquelle vous souhaitez enregistrer la valeur par un ID est que vous souhaitez couvrir plus d'une valeur dans cette balise, n'est-ce pas?
Voici une solution plus simple:
Supposons que vous souhaitiez enregistrer deux valeurs (chaînes) dans cette balise: "prénom" et "nom de famille". Vous pouvez les enregistrer tous les deux dans une chaîne, séparés par un point-virgule:

v.setTag(firstname + ";" + lastname);

... et y accéder en les divisant en un tableau de chaînes:

String[] data = v.getTag().toString().split(";");
System.out.println(data[0]) //firstname
System.out.println(data[1]) //lastname
1
Johannes Schuh

Cela fonctionne pour moi:

setTag(0xffffffff,objContact.onlineid);
0
yu xiaofei