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?

War es hilfreich?

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 von AbsListView.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top