密钥必须是特定于应用程序的资源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);