web-dev-qa-db-ja.com

キーはアプリケーション固有のリソース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;
140
Pentium10

タグIDは一意でなければならず、一意性を保証するためにリソースファイルで作成されたIDにする必要があります。

ビューに含めることができるタグが1つだけの場合

setTag(objContact.onlineid);
53
Robby Pond

SetTag(int、Object)を使用できない理由は、Android 'int'引数に事前にコンパイルされた一意のIDが必要だからです。

String.xml xmlに「firstname」と「secondname」という2つの一意のエントリを作成し、以下のように使用してみてください。

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

私はパーティーに少し遅れましたが、今日自分でこの問題に出くわし、私も答えたいと思いました。この答えは、他の答えを少しまとめたものですが、ひねりがあります。まず、他の人から指摘されている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に置くのではなく、別のファイルを作成する方が良いと思います。

141
britzl

これが仕事をする...

クラスに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)
 ...
49
Sterling Diaz
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);
}
8
Anton Duzenko

viewHolder.itemTitleTextView.getId()を使用しました。ただし、リソースで宣言することもできます:<item type="id" name="conversation_thread_id"/>

3
ViliusK

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
1
Johannes Schuh

これは私のために働く:

setTag(0xffffffff,objContact.onlineid);
0
yu xiaofei