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;
120
demandé sur Pentium10 2010-05-18 21:32:13

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);
45
répondu Robby Pond 2010-05-18 17:48:42

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");
202
répondu ABDroids 2011-05-30 16:46:21

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é.

131
répondu britzl 2014-03-14 17:25:50

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)
 ...
40
répondu Sterling Diaz 2016-03-11 15:38:52
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);
}
7
répondu Anton Duzenko 2017-05-23 12:26:15

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

2
répondu ViliusK 2014-12-10 10:38:43

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
1
répondu Johannes Schuh 2016-05-14 08:05:35

Cela fonctionne pour moi:

setTag(0xffffffff,objContact.onlineid);
0
répondu yu xiaofei 2016-05-08 08:33:33