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;
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);
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");
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.
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)
...
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);
}
J'ai utilisé viewHolder.itemTitleTextView.getId()
. Mais vous pouvez aussi déclarer dans vos ressources: <item type="id" name="conversation_thread_id"/>
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
Cela fonctionne pour moi:
setTag(0xffffffff,objContact.onlineid);