146 votes

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

Pourquoi 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 suit :

private static final int TAG_ONLINE_ID = 1;

229voto

ABDroids Points 1312

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

Essayez de créer deux entrées uniques dans String.xml xml, par exemple, "firstname" et "secondname", et utilisez-les comme suit

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

133 votes

Ajoutez ceci à votre fichier strings.xml : <item type="id" name="TAG_ONLINE_ID"/> et vous pouvez l'utiliser comme une ressource id normale : R.id.TAG_ONLINE_ID

9 votes

Celui-ci devrait être la réponse, il est plus générique.

0 votes

Cela posera un problème si vous utilisez la localisation dans les chaînes de caractères.

151voto

britzl Points 3335

Je suis un peu en retard, mais je suis tombé sur ce problème aujourd'hui et j'ai pensé donner une réponse également. Cette réponse sera un peu une compilation des autres réponses, mais avec un petit quelque chose en plus. Tout d'abord, l'id, comme l'ont souligné d'autres personnes, 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'identifiant doit être un identifiant unique précompilé, comme ceux que vous obtenez pour les chaînes que vous mettez dans values/strings.xml (ie R.string.mystring). Se référer à http://developer.Android.com/guide/topics/resources/available-resources.html y http://developer.Android.com/guide/topics/resources/more-resources.html pour plus d'informations.

Je vous suggère 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é plutôt que de le mettre dans strings.xml comme l'a suggéré EtienneSky.

14 votes

Vous pouvez même vous rendre à <item name="TAG_ONLINE_ID" type="id"/> pour simplifier.

0 votes

C'est la vraie solution ; pas la solution du débutant "je ne comprends pas ce que je fais mais ce hack fonctionne".

1 votes

Note, pour accéder au code, utiliser R.id... y no R.string.. o R.tags...

59voto

Sterling Diaz Points 316

CECI FERA L'AFFAIRE...

Si vous n'avez qu'un seul setTag dans votre classe, vous pouvez utiliser n'importe quel int, peut-être static final déclaré dans la partie supérieure.

Le problème se pose lorsque vous avez 2 ou plusieurs setTag avec des clés différentes. Je veux dire par là que

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

Ce scénario est erroné. Vous devez alors ajouter un fichier de valeurs appelé 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, appelez :

 ...
 setTag(R.id.resourceDrawable, VALUE_1)
 setTag(R.id.imageURI, VALUE_2)
 ...

55voto

Robby Pond Points 37875

L'identifiant de la balise doit être unique, il doit donc être 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);

4 votes

Je veux définir deux balises correspondant à un prénom et à un nom de famille. où dois-je définir les identifiants entiers de ces balises ?

7 votes

Vous pouvez utiliser n'importe quelle ressource - même prendre un R.id.FOO aléatoire où FOO est un identifiant de votre projet.

20 votes

Quelle est la meilleure façon d'obtenir un identifiant unique ? Vraiment Android ?

8voto

Anton Duzenko Points 35
private static final int TAG_ONLINE_ID = 1 + 2 << 24;

devrait fonctionner. Plus d'informations sur ceph3us :

La clé spécifiée doit être un pour s'assurer qu'elle est unique Les clés identifiées comme appartenant au framework Android ou n'étant associées à aucun paquetage provoqueront une erreur de type 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);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X