Question

Pourquoi est-ce que je reçois 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;
Était-ce utile?

La solution

L'identifiant de balise doit être unique, il veut être un identifiant créé dans un fichier de ressources à caractère unique de garantie.

Si la vue ne contiendra une étiquette que vous pouvez simplement faire

setTag(objContact.onlineid);

Autres conseils

La raison pour laquelle vous n'êtes pas en mesure d'utiliser setTag (int, Object) est parce que Android besoin d'un identifiant compilé pré-unique dans l'argument « int ».

Essayez de créer deux entrée unique à String.xml dire xml, « prenom » et « 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 je pensais que je donnerais une réponse aussi bien. Cette réponse sera un peu d'une compilation des autres réponses, mais avec une torsion. Tout d'abord, l'identifiant, comme cela a été signalé par d'autres, 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 quelque part sur le terrain.

L'identifiant doit être un identifiant unique précompilés, tout comme ceux que vous obtenez pour les chaînes que vous mettez en valeurs / strings.xml (c.-à-R.string.mystring). Reportez-vous à http://developer.android.com/guide/topics/resources/available-resources. html et http://developer.android.com/guide/topics/resources/ plus-resources.html pour plus d'informations.

Ma suggestion est que vous créez un nouveau fichier appelé valeurs / Tags.xml et écriture:

    <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 strings.xml comme suggéré EtienneSky.

CE va faire le travail ...

Si vous avez juste 1 setTag dans votre classe, vous pouvez utiliser tout entier, a déclaré static final peut-être en haut.

Le problème vient quand vous avez eu 2 ou plus est setTag 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 erroné. Vous devez ensuite ajouter un fichier de valeur appelée peut-être 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, composez le:

 ...
 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 à partir de ceph3us :

  

La clé spécifiée doit être un identifiant déclaré dans les ressources du   application pour vous assurer qu'il est des clés uniques identifiés comme appartenant à la   Android cadre ou non associé à un paquet provoquera une   IllegalArgumentException à être jeté.

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);
}

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

La raison pour laquelle vous souhaitez enregistrer la valeur par un identifiant est que vous voulez couvrir plus d'une valeur dans cette balise, non?
Voici une solution plus simple:
Disons que vous voulez enregistrer deux valeurs (Strings) dans ce tag: « prenom » et « nom ». Vous pouvez les enregistrer dans une chaîne, séparés par un point virgule:

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

... et les accès 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top