なぜこの例外が発生するのですか?
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は一意でなければならず、一意性を保証するためにリソースファイルで作成されたIDにする必要があります。
ビューに含めることができるタグが1つだけの場合
setTag(objContact.onlineid);
SetTag(int、Object)を使用できない理由は、Android 'int'引数に事前にコンパイルされた一意のIDが必要だからです。
String.xml xmlに「firstname」と「secondname」という2つの一意のエントリを作成し、以下のように使用してみてください。
imageView.setTag(R.string.firstname, "Abhishek");
imageView.setTag(R.string.lastname, "Gondalia");
私はパーティーに少し遅れましたが、今日自分でこの問題に出くわし、私も答えたいと思いました。この答えは、他の答えを少しまとめたものですが、ひねりがあります。まず、他の人から指摘されているidは、コード内で定義された定数(private static final int MYID = 123など)や、フィールドとしてどこかで定義した他のintにはできません。
Idは、values/strings.xmlに入力する文字列(つまりR.string.mystring)で取得するIDと同様に、プリコンパイル済みの一意のIDである必要があります。 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>
EtienneSkyが示唆したように、strings.xmlに置くのではなく、別のファイルを作成する方が良いと思います。
これが仕事をする...
クラスにsetTagが1つしかない場合は、任意のintを使用できます。おそらく、トップで宣言されたstatic 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)
...
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'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で値を保存する理由は、このタグの複数の値をカバーするためです。
こちらがより簡単な解決策です。
「firstname」と「lastname」の2つの値(文字列)をこのタグに保存するとします。セミコロンで区切って、両方を1つの文字列に保存できます。
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);