147

なぜこの例外が発生するのですか?

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;
4

10 に答える 10

231

setTag(int、Object)を使用できない理由は、Androidでは「int」引数にコンパイル済みの一意のIDが必要なためです。

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

imageView.setTag(R.string.firstname, "Abhishek");
imageView.setTag(R.string.lastname, "Gondalia");
于 2011-05-30T16:46:21.207 に答える
155

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

于 2013-02-22T10:16:44.763 に答える
59

これは仕事をします...

クラスにsetTagが1つしかない場合は、任意のintを使用できます。おそらく、上部で静的なfinalが宣言されています。

問題は、異なるキーを持つ2つ以上のsetTagがある場合に発生します。つまり:

public static final int KEY_1 = 1;
public static final int KEY_2 = 2;
...
setTag(KEY_1, VALUE_1)
setTag(KEY_2, VALUE_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, VALUE_1)
 setTag(R.id.imageURI, VALUE_2)
 ...
于 2015-06-14T20:43:30.037 に答える
55

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

ビューに含まれるタグが1つだけの場合は、

setTag(objContact.onlineid);
于 2010-05-18T17:48:42.787 に答える
8
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);
}
于 2013-05-02T18:25:41.637 に答える
3

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

于 2014-12-10T10:38:43.543 に答える
1

あなたはこれを使うことができます:

private static final int TAG_ONLINE_ID = View.generateViewId() + 2 << 24;

一意性アプリケーション固有のリソースIDの場合

于 2020-05-26T01:59:25.060 に答える
0

これは私のために働きます:

setTag(0xffffffff,objContact.onlineid);
于 2016-05-08T08:33:33.257 に答える
0

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
于 2016-05-14T08:05:35.983 に答える
0

これが私のために働く簡単な回避策です:

int tagKey = "YourSimpleKey".hashCode();

myView.setTag(tagKey, "MyTagObject");

ここで重要な手がかりは.hashCode();、文字列を呼び出すことです

于 2020-08-29T20:25:48.270 に答える