Warum bekomme 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 definiert als:
private static final int TAG_ONLINE_ID = 1;
android
illegalargumentexception
Pentium10
quelle
quelle
Der Grund, warum Sie setTag (int, Object) nicht verwenden können, ist, dass Android eine vorkompilierte eindeutige ID im Argument 'int' benötigt.
Versuchen Sie, zwei eindeutige Einträge in String.xml xml zu erstellen, z. B. "Vorname" und "Nachname", und verwenden Sie sie wie folgt
quelle
Ich bin etwas spät zur Party, aber ich bin heute selbst auf dieses Problem gestoßen und dachte, ich würde auch eine Antwort geben. Diese Antwort wird eine kleine Zusammenstellung der anderen Antworten sein, aber mit einer Wendung. Erstens kann die ID, wie von anderen erwähnt, KEINE in Ihrem Code definierte Konstante sein (z. B. private static final int MYID = 123) oder eine andere int, die Sie irgendwo als Feld definieren.
Die ID muss eine vorkompilierte eindeutige ID sein, genau wie die, die Sie für Zeichenfolgen erhalten, die Sie in values / strings.xml (dh R.string.mystring) eingeben. Weitere Informationen finden Sie unter http://developer.android.com/guide/topics/resources/available-resources.html und http://developer.android.com/guide/topics/resources/more-resources.html .
Mein Vorschlag ist, dass Sie eine neue Datei mit dem Namen values / tags.xml erstellen und schreiben:
Ich denke, es ist besser, eine separate Datei zu erstellen, als sie in die Datei strings.xml zu legen, wie EtienneSky vorgeschlagen hat.
quelle
<item name="TAG_ONLINE_ID" type="id"/>
vereinfachen.R.id...
, und nichtR.string..
oderR.tags...
DAS WIRD DEN JOB TUN ...
Wenn Sie nur 1 setTag in Ihrer Klasse haben, können Sie ein beliebiges int verwenden, möglicherweise ein statisches Finale, das oben deklariert ist.
Das Problem tritt auf, wenn Sie zwei oder mehr setTags mit unterschiedlichen Schlüsseln hatten. Ich meine:
Dieses Szenario ist falsch. Anschließend müssen Sie eine Wertedatei mit dem Namen "Vielleicht ids.xml" hinzufügen:
Rufen Sie dann in Ihrer Klasse an:
quelle
sollte arbeiten. Weitere Infos von ceph3us :
aus der Quelle:
quelle
Ich habe benutzt
viewHolder.itemTitleTextView.getId()
. Sie können aber auch in Ihren Ressourcen deklarieren:<item type="id" name="conversation_thread_id"/>
quelle
Das funktioniert bei mir:
quelle
Der Grund, warum Sie den Wert durch eine ID speichern möchten, ist, dass Sie mehr als einen Wert in diesem Tag abdecken möchten, oder?
Hier eine einfachere Lösung:
Angenommen, Sie möchten zwei Werte (Strings) in diesem Tag speichern: "Vorname" und "Nachname". Sie können beide in einer durch Semikolon getrennten Zeichenfolge speichern:
... und greifen Sie darauf zu, indem Sie sie in ein String-Array aufteilen:
quelle
Sie können dies verwenden:
private static final int TAG_ONLINE_ID = View.generateViewId() + 2 << 24;
für Uniqness anwendungsspezifische Ressourcen-ID
quelle