Вопрос

Почему я получаю это исключение?

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;
Это было полезно?

Решение

Идентификатор тега должен быть уникальным, поэтому он хочет, чтобы он был идентификатором, созданным в файле ресурсов, чтобы гарантировать уникальность.

Если представление будет содержать только один тег, хотя вы можете просто сделать

setTag(objContact.onlineid);

Другие советы

Причина, по которой вы не можете использовать Settag (INT, объект), заключается в том, что Android требует предварительно скомпилированного уникального идентификатора в аргументе «int».

Попробуйте создать два уникальных ввода в String.xml XML скажем, «Имя» и «Вторичное значение» и используйте их как ниже

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

Я немного опоздал на вечеринку, но я сегодня наткнулся на эту проблему и думал, что даю ответ. Этот ответ будет немного составлением других ответов, но с поворотом. Прежде всего, идентификатор, как было отмечено другими, не может быть постоянным, определенным в вашем коде (например, частное статическое окончательное INT MyID = 123), либо любой другой INT, который вы определяете в качестве поля где-то.

Идентификатор должен быть предшественным уникальным идентификатором, так же, как те, которые вы получаете для строк, которые вы помещаете в значения / строки .xml (т.е. r.string.mystring). Ссылаться на http://developer.android.com/guide/topics/resources/available-resources.html.html. а также http://developer.android.com/guide/topics/resources/more-resources.html. Чтобы получить больше информации.

Мое предложение состоит в том, что вы создаете новый файл, называемый значений / Tags.xml и запись:

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

Я думаю, что лучше создать отдельный файл вместо того, чтобы положить его в строки.

Это сделает работу ...

Если у вас просто 1 Settag в вашем классе, вы можете использовать любой int, может быть, статический финал, объявленный в верхней части.

Проблема наступает, когда у вас было 2 или более расставленных с разными ключами. Я имею в виду:

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)
 ...
private static final int TAG_ONLINE_ID = 1 + 2 << 24;

должно сработать. Больше информации от ceph3us.:

Указанный ключ должен быть идентификатор, объявленный в ресурсах приложения, чтобы обеспечить его уникальные ключевые ключи, идентифицированные как принадлежность к Android Framework или не связано с каким-либо пакетом, приведет к брошению невыполнителя.

От источника:

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"/>

Причина, по которой вы хотите сохранить значение по идентификатору, это то, что вы хотите покрыть более одного значения в этом теге, верно?
Здесь более простое решение:
Допустим, вы хотите сохранить два значения (строки) в этот тег: «Имя имя» и «LASTNAME». Вы можете сохранить их как в одну строку, разделенную точкой с запятой:

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

... и доступа к ним, расщепляя их в строковый массив:

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

Это работает для меня:

setTag(0xffffffff,objContact.onlineid);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top