キーは、アプリケーション固有のリソースIDでなければなりません

StackOverflow https://stackoverflow.com/questions/2859574

  •  30-09-2019
  •  | 
  •  

質問

なぜこの例外を取得するのですか?

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で2つの一意のエントリを作成してみてください。

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

私はパーティーに少し遅れていますが、今日自分でこの問題につまずいて、答えを出すと思いました。この答えは、他の答えを少し編集しますが、ひねりがあります。まず第一に、他の人が指摘しているように、IDは、どこかでフィールドとして定義するコード(プライベートStatic Final Int MyID = 123など)またはその他のINTで定義されることはできません。

IDは、値/文字列(r.string.mystring)に入れた文字列のために得られるものと同じように、事前補強された一意のIDでなければなりません。参照する http://developer.android.com/guide/topics/resources/available-resources.htmlhttp://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に配置する代わりに、別のファイルを作成する方が良いと思います。

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

クラスに1つのSettagがある場合は、任意のINTを使用できます。これは、上部に宣言された静的な最終的なファイナルを使用できます。

問題は、異なるキーを持つ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フレームワークに属しているか、パッケージに関連付けられていないものとして識別される一意のキーであることを確認すると、違法行為がスローされます。

ソースから:

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で値を保存したい理由は、このタグで複数の値をカバーしたいからですよね?
ここにもっと簡単な解決策:
このタグの2つの値(文字列)を「firstName」と「lastName」に保存するとします。セミコロンで区切られた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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top