De sleutel moet een applicatiespecifieke resource-ID zijn

Waarom krijg ik deze uitzondering?

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)

de betreffende regel is:

((Button) row.findViewById(R.id.btnPickContact)).setTag(TAG_ONLINE_ID,objContact.onlineid);

en ik heb het gedefinieerd als:

private static final int TAG_ONLINE_ID = 1;

Antwoord 1, autoriteit 100%

De reden dat u setTag(int, Object) niet kunt gebruiken, is omdat Android een vooraf gecompileerde unieke id vereist in het ‘int’-argument.

Probeer twee unieke vermeldingen in String.xml xml te maken, bijvoorbeeld “firstname” & “tweede naam” & gebruik ze zoals hieronder

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

Antwoord 2, autoriteit 67%

Ik ben een beetje laat voor het feest, maar ik stuitte vandaag zelf op dit probleem en dacht ik geef ook een antwoord. Dit antwoord zal een beetje een compilatie zijn van de andere antwoorden, maar met een twist. Allereerst kan de id, zoals door anderen is opgemerkt, GEEN constante zijn die in uw code is gedefinieerd (zoals private static final int MYID = 123) of een andere int die u ergens als een veld definieert.

De id moet een voorgecompileerde unieke id zijn, net zoals degene die je krijgt voor strings die je in values/strings.xml plaatst (dwz R.string.mystring). Raadpleeg http://developer.android.com/guide/topics/resources/available-resources. htmlen http://developer.android.com/guide/topics/resources/ more-resources.htmlvoor meer informatie.

Mijn suggestie is dat je een nieuw bestand maakt met de naam values/tags.xml en schrijft:

   <resources xmlns:android="http://schemas.android.com/apk/res/android">
      <item name="TAG_ONLINE_ID" type="id"/>
    </resources>

Ik denk dat het beter is om een ​​apart bestand te maken in plaats van het in strings.xml te plaatsen, zoals EtienneSky suggereerde.


Antwoord 3, autoriteit 26%

DIT ZAL HET WERK DOEN…

Als je maar 1 setTag in je klas hebt, kun je elke int, misschien statische finale bovenaan gebruiken.

Het probleem doet zich voor als je 2 of meer setTag’s met verschillende sleutels had.
Ik bedoel:

public static final int KEY_1 = 1;
public static final int KEY_2 = 2;
...
setTag(KEY_1, VALUE_1)
setTag(KEY_2, VALUE_2)
...

Dat scenario is verkeerd. U moet dan een waardebestand met de naam misschien ids.xml toevoegen met het volgende:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="id" name="resourceDrawable" />
    <item type="id" name="imageURI" />
</resources>

Bel dan in je klas:

...
 setTag(R.id.resourceDrawable, VALUE_1)
 setTag(R.id.imageURI, VALUE_2)
 ...

Antwoord 4, autoriteit 24%

De tag-ID moet uniek zijn, zodat het een ID moet zijn die is gemaakt in een bronnenbestand om uniciteit te garanderen.

Als de weergave maar één tag zal bevatten, kun je dat gewoon doen

setTag(objContact.onlineid);

Antwoord 5, autoriteit 3%

private static final int TAG_ONLINE_ID = 1 + 2 << 24;

zou moeten werken. Meer informatie van ceph3us:

De opgegeven sleutel moet een id zijn die is gedeclareerd in de bronnen van de
applicatie om ervoor te zorgen dat deze uniek is Sleutels geïdentificeerd als behorend tot de
Android-framework of niet gekoppeld aan een pakket zal leiden tot een
IllegalArgumentException moet worden gegooid.

van bron:

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);
}

Antwoord 6

Ik heb viewHolder.itemTitleTextView.getId()gebruikt. Maar u kunt in uw middelen ook aangeven:
<item type="id" name="conversation_thread_id"/>


Antwoord 7

u kunt dit gebruiken:

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

voor uniqness applicatie-specifieke resource-ID


Antwoord 8

Dit werkt voor mij:

setTag(0xffffffff,objContact.onlineid);

Antwoord 9

De reden waarom u de waarde met een id wilt opslaan, is dat u meer dan één waarde in deze tag wilt opnemen, toch?
Hier een eenvoudigere oplossing:
Stel dat u twee waarden (Strings) in deze tag wilt opslaan: “firstname” en “lastname”. Je kunt ze allebei in één string opslaan, gescheiden door een puntkomma:

v.setTag(firstname + ";" + lastname);

… en open ze door ze op te splitsen in een stringarray:

String[] data = v.getTag().toString().split(";");
System.out.println(data[0]) //firstname
System.out.println(data[1]) //lastname

Antwoord 10

Hier is een eenvoudige oplossing die voor mij werkt:

int tagKey = "YourSimpleKey".hashCode();
myView.setTag(tagKey, "MyTagObject");

de belangrijke aanwijzing hier is om .hashCode();aan te roepen op de String

Other episodes