Pregunta

¿Por qué recibo esta excepción?

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 línea en cuestión es:

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

y lo tengo definido como:

private static final int TAG_ONLINE_ID = 1;
¿Fue útil?

Solución

La etiqueta de identificación debe ser único por lo que quiere que sea un id creada en un archivo de recursos a la singularidad de garantía.

Si la vista sólo contendrá una etiqueta a pesar de que sólo puede hacer

setTag(objContact.onlineid);

Otros consejos

La razón por la que no es capaz de utilizar setTag (int, Object) se debe a que el androide requerir una identificación única pre-compilados en el argumento 'int'.

Trate de crear dos entrada única en String.xml por ejemplo XML, "nombre" y "secondname" y usarlos como a continuación

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

Estoy un poco tarde a la fiesta, pero me encontré con este problema por mí mismo hoy y pensé que le daría una respuesta así. Esta respuesta va a ser un poco de una compilación de las otras respuestas, pero con un giro. En primer lugar, el ello, como ha sido señalado por otros, no puede ser una constante definida en el código (como estática final privado int MyID = 123) o cualquier otro int que se define como un lugar de campo.

La identificación tiene que ser un identificador único precompilado, al igual que los que te dan para las cadenas que se pone en los valores / strings.xml (es decir R.string.mystring). Consulte el http://developer.android.com/guide/topics/resources/available-resources. html y http://developer.android.com/guide/topics/resources/ más-resources.html para más información.

Mi sugerencia es que se crea un nuevo archivo llamado valores / tags.xml y escribir:

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

Creo que es mejor crear un archivo independiente en lugar de ponerlo en strings.xml como se sugiere EtienneSky.

Esto va a hacer el trabajo ...

Si sólo tiene 1 setTag en su clase, se podría utilizar cualquier int, tal vez static final declarado en la parte superior.

El problema viene cuando se tenía 2 o más setTag es con llaves diferentes. Es decir:

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

Ese escenario es erróneo. A continuación, deberá añadir un archivo denominado valor tal ids.xml con lo siguiente:

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

A continuación, en su clase, llamada:

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

debería funcionar. Más información de ceph3us :

  

La clave especificada debe ser un identificador declarado en los recursos de la   aplicación para asegurarse de que está claves únicas identificadas como pertenecientes a la   marco de Android o no asociada con cualquier paquete causarán una   IllegalArgumentException a ser lanzado.

de la fuente:

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

He usado viewHolder.itemTitleTextView.getId(). Pero también se puede declarar por sus recursos: <item type="id" name="conversation_thread_id"/>

La razón por la que desea guardar el valor por un id es, que desea cubrir más de un valor para este tag, ¿verdad?
Aquí una solución más sencilla:
Digamos que desea guardar dos valores (cadenas) en esta etiqueta: "nombre" y "apellido". Puede guardar los dos en una sola cuerda, separados por punto y coma:

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

... y acceder a ellos de dividir en una matriz de cadenas:

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

Esto funciona para mí:

setTag(0xffffffff,objContact.onlineid);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top