android - studio - recursos para crear una app
La clave debe ser una identificación de recurso específica de la aplicación (8)
¿Por qué obtengo 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;
Esto funciona para mí:
setTag(0xffffffff,objContact.onlineid);
He usado viewHolder.itemTitleTextView.getId()
. Pero también puede declarar en sus recursos: <item type="id" name="conversation_thread_id"/>
La identificación de la etiqueta debe ser única, por lo que quiere que sea una identificación creada en un archivo de recursos para garantizar la exclusividad.
Si la vista solo contendrá una etiqueta, puedes hacer
setTag(objContact.onlineid);
La razón por la que desea guardar el valor con una identificación es que desea cubrir más de un valor en esta etiqueta, ¿no?
Aquí una solución más simple:
Digamos que quiere guardar dos valores (Strings) en esta etiqueta: "firstname" y "lastname". Puede guardarlos en una cadena, separados por punto y coma:
v.setTag(firstname + ";" + lastname);
... y acceder a ellos dividiéndolos en una matriz de cadenas:
String[] data = v.getTag().toString().split(";");
System.out.println(data[0]) //firstname
System.out.println(data[1]) //lastname
La razón por la que no puede usar setTag (int, Object) es porque android requiere un id único precompilado en el argumento ''int''.
Intenta crear dos entradas únicas en String.xml xml, por ejemplo, "firstname" y "secondname" y úsalas de la siguiente manera
imageView.setTag(R.string.firstname, "Abhishek");
imageView.setTag(R.string.lastname, "Gondalia");
Llego un poco tarde a la fiesta, pero hoy mismo tropecé con este problema y pensé en dar una respuesta también. Esta respuesta será un poco una compilación de las otras respuestas, pero con un giro. En primer lugar, el ID, como han señalado otros, NO puede ser una constante definida en su código (como private static final int MYID = 123) o cualquier otra int que defina como un campo en algún lugar.
El ID debe ser un ID exclusivo precompilado, como los que obtienes para las cadenas que pones en values / strings.xml (es decir, R.string.mystring). Consulte http://developer.android.com/guide/topics/resources/available-resources.html y http://developer.android.com/guide/topics/resources/more-resources.html para obtener más información.
Mi sugerencia es que cree un nuevo archivo llamado values / tags.xml y escriba:
<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 separado en lugar de ponerlo en strings.xml como sugirió EtienneSky.
ESTO HARÁ EL TRABAJO ...
Si solo tienes 1 setTag en tu clase, puedes usar cualquier int, quizás static final declarado en la parte superior.
El problema surge cuando tienes 2 o más SetTag con diferentes claves. Quiero decir:
public static final int KEY_1 = 1;
public static final int KEY_2 = 2;
...
setTag(KEY_1)
setTag(KEY_2)
...
Ese escenario es incorrecto Luego necesita agregar un archivo de valor llamado quizás ids.xml con lo siguiente:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="id" name="resourceDrawable" />
<item type="id" name="imageURI" />
</resources>
Luego, en tu clase, llama:
...
setTag(R.id.resourceDrawable, KEY_1)
setTag(R.id.imageURI, KEY_2)
...
private static final int TAG_ONLINE_ID = 1 + 2 << 24;
Deberia trabajar. Más información de ceph3us :
La clave especificada debe ser una identificación declarada en los recursos de la aplicación para garantizar que sea única. Las claves identificadas como pertenecientes a la infraestructura de Android o no asociadas a ningún paquete causarán que se genere una IllegalArgumentException.
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);
}