Dlaczego otrzymuję ten wyjątek?
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)
przedmiotowa linia to:
((Button) row.findViewById(R.id.btnPickContact)).setTag(TAG_ONLINE_ID,objContact.onlineid);
i mam to zdefiniowane jako:
private static final int TAG_ONLINE_ID = 1;
android
illegalargumentexception
Pentium10
źródło
źródło
Powodem, dla którego nie możesz użyć setTag (int, Object), jest to, że Android wymaga prekompilowanego unikalnego identyfikatora w argumencie „int”.
Spróbuj utworzyć dwa unikalne wpisy w String.xml xml, powiedz „imię” i „drugie imię” i użyj ich jak poniżej
źródło
Trochę się spóźniłem na imprezę, ale sam dzisiaj natknąłem się na ten problem i pomyślałem, że też dam odpowiedź. Ta odpowiedź będzie trochę kompilacją innych odpowiedzi, ale z pewnym elementem. Po pierwsze, id, jak wskazywali inni, NIE może być stałą zdefiniowaną w Twoim kodzie (np. Private static final int MYID = 123) ani żadną inną wartością typu int, którą zdefiniujesz gdzieś jako pole.
Identyfikator musi być prekompilowanym unikalnym identyfikatorem, tak jak te, które otrzymujesz dla łańcuchów, które umieszczasz w value / strings.xml (tj. R.string.mystring). Więcej informacji znajdziesz na http://developer.android.com/guide/topics/resources/available-resources.html i http://developer.android.com/guide/topics/resources/more-resources.html .
Moja sugestia jest taka, aby utworzyć nowy plik o nazwie values / tags.xml i napisać:
Myślę, że lepiej jest utworzyć osobny plik zamiast umieszczać go w strings.xml, jak sugerował EtienneSky.
źródło
<item name="TAG_ONLINE_ID" type="id"/>
uprościć to.R.id...
, a nieR.string..
lubR.tags...
TO WYKONUJE PRACĘ ...
Jeśli masz tylko 1 setTag w swojej klasie, możesz użyć dowolnego typu int, może statycznego final zadeklarowanego na górze.
Problem pojawia się, gdy masz 2 lub więcej setTagów z różnymi kluczami. Mam na myśli:
Ten scenariusz jest zły. Następnie musisz dodać plik wartości o nazwie może ids.xml z następującymi elementami:
Następnie w klasie zadzwoń:
źródło
powinno działać. Więcej informacji od ceph3us :
ze źródła:
źródło
Użyłem
viewHolder.itemTitleTextView.getId()
. Ale możesz również zadeklarować w swoich zasobach:<item type="id" name="conversation_thread_id"/>
źródło
To działa dla mnie:
źródło
Powodem, dla którego chcesz zapisać wartość przez identyfikator, jest to, że chcesz uwzględnić więcej niż jedną wartość w tym tagu, prawda?
Oto prostsze rozwiązanie:
powiedzmy, że chcesz zapisać dwie wartości (ciągi znaków) w tym tagu: „imię” i „nazwisko”. Możesz zapisać je oba w jednym ciągu, oddzielonym średnikiem:
... i uzyskaj do nich dostęp, dzieląc je na tablicę ciągów:
źródło
możesz użyć tego:
private static final int TAG_ONLINE_ID = View.generateViewId() + 2 << 24;
dla unikalności identyfikatora zasobu specyficznego dla aplikacji
źródło