密钥必须是特定于应用程序的资源ID
为什么我得到这个例外?
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;
标签ID必须是唯一的,因此它希望它是在资源文件中创build的ID以保证唯一性。
如果视图只包含一个标签,尽pipe你可以做
setTag(objContact.onlineid);
你不能使用setTag(int,Object)的原因是因为android在'int'参数中需要一个预编译的唯一标识符。
尝试在String.xml中创build两个唯一的条目,如“firstname”&“secondname”,并按如下所示使用它们
imageView.setTag(R.string.firstname, "Abhishek"); imageView.setTag(R.string.lastname, "Gondalia");
我晚了一点,但是我今天自己偶然发现了这个问题,我想我也会给出答案。 这个答案将是其他答案的汇编,但有一个转折。 首先,正如其他人所指出的那样,id不能是你的代码中定义的常量(比如private static final int MYID = 123)或者你定义为某个字段的其他int。
这个id必须是一个预编译的唯一id,就像你在string中inputvalues / 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 。
我的build议是,你创build一个名为values / tags.xml的新文件并写入:
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <item name="TAG_ONLINE_ID" type="id"/> </resources>
我觉得最好是创build一个单独的文件,而不是像EtienneSky所build议的那样把它放在strings.xml中。
这将做工作…
如果在你的类中只有一个setTag,你可以使用任何int,也许在最上面声明的static final。
当你有两个或更多setTag与不同的键时,问题来了。 我的意思是:
public static final int KEY_1 = 1; public static final int KEY_2 = 2; ... setTag(KEY_1) setTag(KEY_2) ...
那种情况是错误的。 然后你需要添加一个名为maybe ids.xml的值文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <item type="id" name="resourceDrawable" /> <item type="id" name="imageURI" /> </resources>
然后,在你的class级中,打电话给:
... setTag(R.id.resourceDrawable, KEY_1) setTag(R.id.imageURI, KEY_2) ...
private static final int TAG_ONLINE_ID = 1 + 2 << 24;
应该pipe用。 更多的信息来自ceph3us :
指定的键应该是在应用程序的资源中声明的一个id,以确保它是唯一的被标识为属于Android框架的键或者不与任何软件包关联将导致抛出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"/>
你想通过id保存值的原因是,你想覆盖这个标签中的多个值,对吗?
这里更简单的解决scheme:
假设您要将两个值(string)保存到此标记中:“firstname”和“lastname”。 您可以将它们保存在一个string中,用分号分隔:
v.setTag(firstname + ";" + lastname);
…并通过将它们分割成一个string数组来访问它们:
String[] data = v.getTag().toString().split(";"); System.out.println(data[0]) //firstname System.out.println(data[1]) //lastname
这适用于我:
setTag(0xffffffff,objContact.onlineid);