ActionBarSherlock + Karten + Loader = java.lang.NoClassDefFoundError

8

Bearbeiten: Eine ausführliche Anleitung finden Sie in meiner Antwort .

Ich kämpfe jetzt seit zwei Tagen damit, hoffe, dass jemand helfen kann.

Ich versuche, den neusten ActionBarSherlock (4.0) mit einem MapView zu verwenden. Ich wusste, dass es mit Fragmenten problematisch ist, aber ich brauche sie nicht in dieser Aktivität. Aber ich brauche Loader und es scheint, dass ich auch die FragmentActivity erweitern muss, um Loader zu verwenden. Kein Problem, dachte ich, wir haben die android-support-v4-googlemaps von Pete Doyle. Wie auf vielen SO-Threads und Google Groups vorgeschlagen, baue ich das ABS mit android-support-v4-googlemaps JAR (android-support-v13-r7-googlemaps.jar) anstelle von android-support-v4.jar. Dann habe ich es als Bibliothek für mein Projekt verwendet.

Nun möchte ich meine Aktivität so haben:

public class BananoutMapActivity extends SherlockFragmentActivity implements LoaderCallbacks<ArrayList<EventItem>>{

Das Problem:

Es wird kompiliert, aber es wird ein Laufzeitfehler ausgegeben: E/AndroidRuntime(29159): java.lang.NoClassDefFoundError: ndl.klimczak.bananout.BananoutMapActivity

Dinge, die ich dreifach überprüft habe:

  • Sowohl das ActionBarSherlock-Bibliotheksprojekt als auch mein Projekt sind auf Google APIs 4.0.3
  • ausgerichtet
  • Ich habe <uses-library android:name="com.google.android.maps" /> und ich habe es im Application-Tag.
  • Ich habe auch die gleiche android-support-v13-r7-googlemaps.jar im Build-Pfad meines Projekts
  • Ich habe .BananoutMapActivity in meinem Manifest deklariert

Was ist interessant:

  • Wenn ich es auf einem ICS-Emulator ausführe, funktioniert es (der Fehler erscheint auf 2. * Emulatoren und meinem 2.3.7-Gerät), bei Honeycomb würde es wahrscheinlich funktionieren, es ist die Frage der Verwendung der ACL

  • Wenn ich den implements LoaderCallbacks<ArrayList<EventItem>> Teil lösche, funktioniert es auch, aber auf diese Weise kann ich LoaderManager

  • nicht benutzen

Warum in aller Welt der NoClassDefFoundError-Fehler und wie bekomme ich die Loader in meiner MapCapableSherlockEnabledFragmentActivity?

    
Michał K 05.04.2012, 22:53
quelle

2 Antworten

6

Sie müssen die Loader aus der Support-Bibliothek und nicht die aus der Plattform verwenden. Da diese nur unter Android 3.0 und höher zur Verfügung stehen und die Tatsache, dass Sie sie in Ihre Klassendefinition aufgenommen haben, bewirkt, dass der Klassenloader vor Version 3.0 Ihre Klasse sofort ablehnt. Das Wechseln Ihrer Importe in die Support-Bibliothek-Varianten sollte alles sein, was dafür benötigt wird.

Wenn Sie oberhalb der Ausnahme in Logcat nachsehen, sollten Sie einen oder mehrere VerifyErrors sehen, die speziell aufzeigen, wofür das Problem aufgetreten ist.

Sie können die android-support-v13 Bibliothek auch nur auf Android 3.2 und höher verwenden (daher der v13 im Namen).

    
Jake Wharton 05.04.2012, 23:10
quelle
19

Veraltet : Ich nehme an, dass das Problem mit Google Maps Android API v2 . Wenn Sie sich für die Verwendung von veraltetem v1 entscheiden, finden Sie die Lösung unten.

Also hat Jake das genaue Problem beantwortet, aber ich dachte, dass es für jemanden nützlich wäre, eine mehr oder weniger detaillierte Anleitung zu haben. Wie kann ActionBarSherlock mit Karten arbeiten?

Ich nehme an, dass Sie ActionBarSherlock als Bibliotheksprojekt eingerichtet haben und arbeiten, Sie können viele Tutorials dazu finden.

Wenn Sie MapActivity nur mit ActionBarSherlock verwenden möchten - es ist einfach:

  1. Laden Sie Jakes MapsPlugin Ссылка ,
  2. herunter
  3. Platziere es im libs-Ordner deiner App und füge es in den Build-Pfad ein.

Wenn Sie MapView mit Honeycomb-Funktionen wie Fragmente oder Loader verwenden möchten:

  1. Laden Sie das Android-Support-Paket von Pete Doyle mit Google Maps herunter: Ссылка ,
  2. Mach ein jar (wenn du vorkompilierte jars herunterlädst, ist es nur eine Frage der Umbenennung von zip in jar, falls du es nicht wusstest). Sie können die v13-Version erhalten, einschließlich v4,
  3. Erstellen Sie eine Kopie der ActionBarSherlock-Bibliothek im Arbeitsbereich (nennen Sie sie ActionBarSherlockMaps oder etwas Ähnliches), um sich nicht mit der ursprünglichen zu verwirren, Sie müssen sie später verwenden oder etwas,
  4. Denken Sie daran, sowohl ActionBarSherlockMaps als auch Ihr Projekt mit den neuesten Google APIs zu erstellen. Wenn Sie reguläres Android 4.0.3 ohne Google APIs verwenden, funktioniert es nicht
  5. Lege das jar (zB android-support-v13-r7-googlemaps.jar) in den libs-Ordner der neuen ActionBarSherlockMaps, schließe die android-support-v4.jar vom Build-Pfad aus und füge android-support-v13- r7-googlemaps.jar
  6. Mit Version 7 haben Sie in diesem Schritt in SherlockFragmentActivity einen Kompilierungsfehler. Finde protected void supportInvalidateOptionsMenu() und ändere seine Sichtbarkeit in public (dieser Schritt wird in der neuen Version von ABS nicht benötigt)
  7. Setzen Sie das selbe jar in den libs-Ordner Ihres Projekts, schließen Sie die android-support-v4.jar vom Build-Pfad aus und fügen Sie android-support-v13-r7-googlemaps.jar
  8. hinzu
  9. Stellen Sie sicher, dass Sie <uses-library android:name="com.google.android.maps" /> in das Anwendungs-Tag Ihrer Manifest-Datei
  10. schreiben
  11. Stellen Sie sicher, dass Sie die richtigen Importe für Ihre Fragmente, Loader und andere Dinge verwenden! Sie sollten z.B. import android.support.v4.app.LoaderManager; nicht von import android.app.LoaderManager;
  12. Genießen Sie ActionBarSherlock + Google Maps + Fragmente + Ladeprogramme

Dies ist derzeit die beste Problemumgehung, bis Google Maps in die Kompatibilitätsbibliothek legt. Ich hoffe, sie werden es tun, bevor 4. * Geräte Nummer 2 übertreffen. * ...

    
Michał K 06.04.2012 08:56
quelle