Der Schlüssel muss eine anwendungsspezifische Ressource-ID sein
-
30-09-2019 - |
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;
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);