Frage

Warum erhalte ich diese Ausnahme?

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)

die fragliche Zeile lautet:

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

und ich habe es wie folgt definiert:

private static final int TAG_ONLINE_ID = 1;
War es hilfreich?

Lösung

Die Tag-ID muss eindeutig sein, damit es sie will eine ID in einer Ressourcen-Datei zu garantieren Einzigartigkeit geschaffen werden.

Wenn die Ansicht wird nur einen Tag enthält, obwohl Sie nur tun können,

setTag(objContact.onlineid);

Andere Tipps

Der Grund, warum Sie nicht in der Lage sind setTag (int, Object) zu verwenden ist, weil Android erfordert eine vorkompilierte eindeutige ID im ‚int‘ Argumente.

Versuchen Sie die Schaffung von zwei eindeutigen Eintrag in String.xml xml sagen: "Vorname" & "secondname" & sie als unten

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

Ich bin ein wenig spät zur Party, aber ich stolperte über dieses Problem mich heute und dachte, dass ich auch eine Antwort geben würde. Diese Antwort wird ein bisschen eine Zusammenstellung der anderen Antworten, aber mit einem Twist. Zunächst einmal die ID, wie von anderen darauf hingewiesen wurde, kann keine Konstante im Code (wie private static final int MYID = 123) oder jede andere int definiert sein, dass Sie als ein Feld irgendwo definieren.

Die ID hat eine vorkompilierte eindeutige ID zu sein, genau wie die, die Sie für Streicher bekommen, dass Sie in Werte / strings.xml setzen (dh R.string.mystring). Siehe http://developer.android.com/guide/topics/resources/available-resources. html und http://developer.android.com/guide/topics/resources/ mehr-resources.html für weitere Informationen.

Mein Vorschlag ist, dass Sie eine neue Datei namens Werte / tags.xml und Schreib erstellen:

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

Ich denke, es ist besser, eine separate Datei zu erstellen, anstatt sie in strings.xml setzen als EtienneSky vorgeschlagen.

Dies wird die Arbeit tun ...

Wenn Sie nur 1 setTag in Ihrer Klasse haben, können Sie jede int verwenden könnte, vielleicht static final in der oben erklärt wurde.

Das Problem kommt, wenn Sie 2 oder mehr hatten setTag mit verschiedenen Schlüsseln sind. Ich meine:

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

Das Szenario ist falsch. Sie müssen dann einen Wert Datei vielleicht ids.xml mit folgenden genannt hinzuzufügen:

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

Dann in Ihrer Klasse, Aufruf:

 ...
 setTag(R.id.resourceDrawable, KEY_1)
 setTag(R.id.imageURI, KEY_2)
 ...
private static final int TAG_ONLINE_ID = 1 + 2 << 24;

sollte funktionieren. Weitere Informationen von ceph3us :

  

Der angegebene Schlüssel sollte eine ID in den Ressourcen des deklariert werden   Anwendung, um sicherzustellen, ist einzigartig Keys als zu dem identifizierten   Android Framework oder nicht mit jedem Paket zugeordnet wird ein verursachen   Illegal geworfen werden.

aus Quelle:

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

Ich habe verwendet viewHolder.itemTitleTextView.getId(). Sie können aber auch in Ihren Ressourcen erklären: <item type="id" name="conversation_thread_id"/>

Der Grund, warum Sie den Wert durch eine ID gespeichert werden sollen, ist, dass Sie mehr als ein Wert in diesem Tag abdecken wollen, nicht wahr?
Hier ist eine einfachere Lösung:
Angenommen, Sie haben zwei Werte (Strings) in diesen Tag speichern möchten: „Vorname“ und „Nachname“. Sie können sie beide in einer Zeichenkette, getrennt durch Semikolon sparen:

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

... und Zugang sie durch Spaltung sie in ein String-Array:

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

Dies funktioniert für mich:

setTag(0xffffffff,objContact.onlineid);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top