Domanda

Perché ricevo questa eccezione?

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 linea in questione è:

((Button) row.findViewById(R.id.btnPickContact)).setTag(TAG_ONLINE_ID,objContact.onlineid);

e l'ho definito come:

private static final int TAG_ONLINE_ID = 1;
È stato utile?

Soluzione

Il tag id deve essere univoco in modo che vuole essere un id creata in un file di risorse per garantire l'unicità.

Se la vista conterrà solo un tag anche se si può fare solo

setTag(objContact.onlineid);

Altri suggerimenti

Il motivo non siete in grado di utilizzare setTag (int, Object) è perché Android richiedono un ID univoco precompilato nell'argomento 'int'.

Prova a creare due voce univoca in String.xml diciamo xml, "Nome" e "secondname" e li usa come di seguito

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

Sono un po 'in ritardo alla festa, ma mi sono imbattuto in questo problema io stesso oggi e ho pensato di dare una risposta pure. Questa risposta sarà un po 'di una compilation delle altre risposte, ma con un tocco. Prima di tutto, l'id, come è stato sottolineato da altri, non può essere una costante definita nel codice (ad esempio private static final int MyID = 123) o qualsiasi altro int che si definisce come un qualche campo.

L'id deve essere un ID univoco precompilata, proprio come quelli che si hanno per le stringhe che si mette nei valori / strings.xml (cioè R.string.mystring). Fare riferimento a http://developer.android.com/guide/topics/resources/available-resources. html e http://developer.android.com/guide/topics/resources/ più-resources.html per ulteriori informazioni.

Il mio suggerimento è che si crea un nuovo file chiamato i valori / tags.xml e scrittura:

    <resources xmlns:android="http://schemas.android.com/apk/res/android">
      <item name="TAG_ONLINE_ID" type="id"/>
    </resources>

Credo che sia meglio creare un file separato, invece di metterlo in strings.xml come suggerito EtienneSky.

Questo farà il lavoro ...

Se v'è solo 1 setTag nella tua classe, è possibile utilizzare qualsiasi int, forse static finale dichiarato nella parte superiore.

Il problema nasce quando si ha 2 o più setTag è con chiavi diverse. Voglio dire:

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

Questo scenario è sbagliato. È quindi necessario aggiungere un file di valore chiamato forse ids.xml con la seguente:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="id" name="resourceDrawable" />
    <item type="id" name="imageURI" />
</resources>

Poi, nella classe, chiamata:

 ...
 setTag(R.id.resourceDrawable, KEY_1)
 setTag(R.id.imageURI, KEY_2)
 ...
private static final int TAG_ONLINE_ID = 1 + 2 << 24;

dovrebbe funzionare. Maggiori informazioni da ceph3us :

  

La chiave specificata dovrebbe essere un id dichiarato nelle risorse del   applicazione per assicurarsi che sia Keys unici identificati come appartenenti al   framework Android o non associata a qualsiasi pacchetto causerà un   IllegalArgumentException per essere gettato.

dalla fonte:

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

ho usato viewHolder.itemTitleTextView.getId(). Ma si può anche dichiarare le vostre risorse: <item type="id" name="conversation_thread_id"/>

Il motivo per cui si desidera salvare il valore da un ID è, che si vuole coprire più di un valore in questo tag, giusto?
Qui un altro soluzione semplice:
Diciamo che si desidera salvare due valori (stringhe) in questo tag: "Nome" e "cognome". È entrambi possibile salvare in una stringa, separati da virgola:

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

... e loro l'accesso dividendosi loro in una matrice di stringhe:

String[] data = v.getTag().toString().split(";");
System.out.println(data[0]) //firstname
System.out.println(data[1]) //lastname

Questo funziona per me:

setTag(0xffffffff,objContact.onlineid);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top