La clé doit être un ID de ressource spécifique à l'application
Pourquoi obtenir 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;
8 réponses
L'id de balise doit être unique afin qu'il soit un id créé dans un fichier de ressources pour garantir l'unicité.
Si la vue ne contient qu'une seule balise, vous pouvez simplement faire
setTag(objContact.onlineid);
La raison pour laquelle vous n'êtes pas en mesure d'utiliser setTag(int, Object) est que android nécessite un identifiant unique pré-compilé dans l'argument 'int'.
Essayez de créer deux entrées uniques dans la chaîne.xml xml dire, "firstname" & "secondname" et les utiliser 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 je suis tombé sur ce problème moi-même aujourd'hui et j'ai pensé que je donnerais une réponse aussi. Cette réponse sera un peu une compilation des autres réponses, mais avec une torsion. Tout d'abord, l'id, comme d'autres l'ont souligné, ne peut pas être une constante définie dans votre code (comme private static final int MYID = 123) ou tout autre int que vous définissez comme un champ quelque part.
L'id doit être un id unique précompilé, tout comme ceux que vous obtenez pour les chaînes que vous mettez dans des valeurs / chaînes.xml (ie R. string.mystring). Reportez-vous à 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 que vous créez un nouveau fichier appelé valeurs/tags.xml et é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 mettre dans des chaînes.xml comme etiennesky suggéré.
CELA FERA LE TRAVAIL...
Si vous avez juste 1 setTag dans votre classe, vous pouvez utiliser n'importe quel int, peut-être statique final déclaré en haut.
Le problème vient quand vous aviez 2 settags 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é maybe ids.xml avec ce qui suit:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="id" name="resourceDrawable" />
<item type="id" name="imageURI" />
</resources>
Ensuite, dans votre classe, appelez:
...
setTag(R.id.resourceDrawable, KEY_1)
setTag(R.id.imageURI, KEY_2)
...
private static final int TAG_ONLINE_ID = 1 + 2 << 24;
Devrait fonctionner. Plus d'informations de ceph3us :
La clé spécifiée doit être un id déclaré dans les ressources application pour s'assurer qu'il S'agit de Clés uniques identifiées comme appartenant à la Android framework ou non associé à un paquet provoquera un IllegalArgumentException à lancer.
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 également déclarer dans vos ressources:
<item type="id" name="conversation_thread_id"/>
La raison pour laquelle vous voulez enregistrer la valeur d'un id est, que vous voulez couvrir plus d'une valeur dans cette balise, droit?
Voici une solution plus simple:
Disons que vous voulez enregistrer deux valeurs (chaînes) dans cette balise: "firstname" et "lastname". 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);