Ключ должен быть идентификатором ресурса для конкретного приложения
почему я получаю это исключение?
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)
линия:
((Button) row.findViewById(R.id.btnPickContact)).setTag(TAG_ONLINE_ID,objContact.onlineid);
и я определил его как:
private static final int TAG_ONLINE_ID = 1;
8 ответов:
идентификатор тега должен быть уникальным, поэтому он должен быть идентификатором, созданным в файле ресурсов, чтобы гарантировать уникальность.
Если представление будет содержать только один тег, хотя вы можете просто сделать
setTag(objContact.onlineid);
причина, по которой вы не можете использовать setTag(int, Object), заключается в том, что android требует предварительно скомпилированного уникального идентификатора в аргументе 'int'.
попробуйте создать две уникальные записи в строку.xml xml говорит, "firstname" & "secondname" и использовать их, как показано ниже
imageView.setTag(R.string.firstname, "Abhishek"); imageView.setTag(R.string.lastname, "Gondalia");
Я немного опоздал на вечеринку, но сегодня я сам наткнулся на эту проблему и подумал, что тоже дам ответ. Этот ответ будет немного компиляцией других ответов, но с изюминкой. Прежде всего, идентификатор, как было указано другими, не может быть константой, определенной в вашем коде (например, private static final int MYID = 123) или любым другим int, который вы определяете как поле где-то.
идентификатор должен быть предварительно скомпилированным уникальным идентификатором, как и те, которые вы получаете строки, которые вы вставляете в значения / строки.в XML (т. е. строки Р..mystring). См.http://developer.android.com/guide/topics/resources/available-resources.html и http://developer.android.com/guide/topics/resources/more-resources.html для получения дополнительной информации.
мое предложение заключается в том, что вы создаете новый файл с названием значения/теги.XML и написать:
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <item name="TAG_ONLINE_ID" type="id"/> </resources>Я думаю, что лучше создать отдельный файл, а не класть его в строках.XML как - Предположил этьеннский.
ЭТО СДЕЛАЕТ РАБОТУ...
Если у вас просто есть 1 setTag в вашем классе, вы можете использовать любой int, возможно, статический финал, объявленный в верхней части.
проблема возникает, когда у вас 2 или более setTag с разными ключами. Я имею в виду:
public static final int KEY_1 = 1; public static final int KEY_2 = 2; ... setTag(KEY_1) setTag(KEY_2) ...этот сценарий неверен. Затем вам нужно добавить в файл значение может быть идентификаторами.xml со следующим:
<?xml version="1.0" encoding="utf-8"?> <resources> <item type="id" name="resourceDrawable" /> <item type="id" name="imageURI" /> </resources>затем, в вашем классе, позвоните:
... setTag(R.id.resourceDrawable, KEY_1) setTag(R.id.imageURI, KEY_2) ...
private static final int TAG_ONLINE_ID = 1 + 2 << 24;должны работать. Дополнительная информация от ceph3us:
указанный ключ должен быть идентификатором, объявленным в ресурсах применение для того чтобы обеспечить его уникально ключи определенные как принадлежащий к Рамки андроида или не связанные с любым пакетом причинят IllegalArgumentException будет брошен.
из источника:
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); }
я использовал
viewHolder.itemTitleTextView.getId(). Но вы также можете объявить в своих ресурсах:<item type="id" name="conversation_thread_id"/>
причина, по которой вы хотите сохранить значение по идентификатору, заключается в том, что вы хотите покрыть более одного значения в этом теге, верно?
Вот более простое решение:
Допустим, вы хотите сохранить два значения (строки) в этот тег: "firstname" и "lastname". Вы можете сохранить их в одной строке, разделенной точкой с запятой:v.setTag(firstname + ";" + lastname);... и получить к ним доступ, разделив их на строковый массив:
String[] data = v.getTag().toString().split(";"); System.out.println(data[0]) //firstname System.out.println(data[1]) //lastname
Comments