So lösen Sie java.lang.nosuchMethoderror: android.widget.abslistView.isitemChecked
-
25-10-2019 - |
Frage
Ich kompile ein Android -Projekt gegen API Level 11 (3.0) und habe diesen Code:
if (parent instanceof AbsListView) {
checked = ((AbsListView)parent).isItemChecked(position);
}
Wenn ich dies in Geräten vor 3.0 (niedriger als API Level 11) ausführe, erhalte ich diesen Fehler:
java.lang.NoSuchMethodError: android.widget.AbsListView.isItemChecked
Im AbslistView -Dokumentation, isItemChecked
Ist angegeben, dass sie die Kompatibilität von API Level 1 haben, warum bekomme ich dann den Fehler?
Lösung
Anscheinend passiert das:
Seit API Level 1 hat Android Framework bereits isItemChecked
an ListView
.
Bei der Veröffentlichung von API Level 11 hat Google jedoch die Definition von verschoben isItemChecked
zu AbsListView
, was die Superklasse von ist ListView
. Diese Änderung verhindert nicht vorhandenen Code (für das Kompilieren gegen Pre-API-Stufe 11) zum Kompilieren gegen API-Stufe 11, aber die generierte .CLASS-Datei sucht tatsächlich nach isItemChecked
an AbsListView
, was auf Geräten der Stufe 11 vor der API nicht existiert.
Auf der API -Unterschiede Bericht, es ist angegeben:
boolean isItemChecked(int)
Die Methode wurde lokal definiert, wird aber jetzt von geerbt vonAbsListView
.
Dies ist eine gefährliche Fallstrick, da die Kompatibilität überhaupt nicht an die Kompilierungszeit überprüft werden kann. Sie müssen sich daran erinnern, es als wirken ListView
und nicht AbsListView
. Vielleicht sollten wir vermeiden AbsListView
Altogher.