Ключ должен быть идентификатором ресурса приложения
Почему я получаю это исключение?
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;
Ответы
Ответ 1
Идентификатор тега должен быть уникальным, поэтому он хочет, чтобы он был идентификатором, созданным в файле ресурсов, чтобы гарантировать уникальность.
Если представление будет содержать только один тег, но вы можете просто сделать
setTag(objContact.onlineid);
Ответ 2
Причина, по которой вы не можете использовать setTag (int, Object), - это то, что для аргумента "int" требуется ансамбль pre-compiled unique.
Попробуйте создать две уникальные записи в String.xml xml: "firstname" и "secondname" и используйте их ниже
imageView.setTag(R.string.firstname, "Abhishek");
imageView.setTag(R.string.lastname, "Gondalia");
Ответ 3
Я немного опаздываю на вечеринку, но сегодня сам наткнулся на эту проблему и подумал, что даю ответ. Этот ответ будет немного компиляцией других ответов, но с завихрением. Прежде всего, id, как было указано другими, НЕ может быть константой, определенной в вашем коде (например, private static final int MYID = 123) или любым другим int, который вы определяете как поле где-то.
Идентификатор должен быть предварительно скомпилированным уникальным идентификатором, как и те, которые вы получаете для строк, которые вы вставляете в значения /strings.xml(например, R.string.mystring). Для получения дополнительной информации см. http://developer.android.com/guide/topics/resources/available-resources.html и http://developer.android.com/guide/topics/resources/more-resources.html.
Мое предложение состоит в том, что вы создаете новый файл с именем values /tags.xml и пишите:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<item name="TAG_ONLINE_ID" type="id"/>
</resources>
Я думаю, что лучше создать отдельный файл вместо того, чтобы помещать его в strings.xml, как предположил EtienneSky.
Ответ 4
ЭТО БУДЕТ РАБОТАТЬ...
Если у вас только 1 setTag в вашем классе, вы можете использовать любой int, возможно статический final, объявленный в верхней части.
Проблема возникает, когда у вас было 2 или более setTag с разными ключами.
Я имею в виду:
public static final int KEY_1 = 1;
public static final int KEY_2 = 2;
...
setTag(KEY_1)
setTag(KEY_2)
...
Этот сценарий неверен. Затем вам нужно добавить файл значений, например, ids.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)
...
Ответ 5
private static final int TAG_ONLINE_ID = 1 + 2 << 24;
должен работать. Дополнительная информация от ceph3us:
Указанный ключ должен быть объявлен id в ресурсах приложение для обеспечения его уникальности. Ключи, идентифицированные как принадлежащие к Каркас Android или не связанный с каким-либо пакетом Исключить исключение IllegalArgumentException.
из источника:
public void setTag(int key, final Object tag) {
// If the package id is 0x00 or 0x01, it 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);
}
Ответ 6
Я использовал viewHolder.itemTitleTextView.getId()
. Но вы также можете заявить в своих ресурсах:
<item type="id" name="conversation_thread_id"/>
Ответ 7
Причина, по которой вы хотите сохранить значение по 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
Ответ 8
Это работает для меня:
setTag(0xffffffff,objContact.onlineid);