8

Edytuj: Aby uzyskać szczegółowe instrukcje, sprawdź my answer.ActionBarSherlock + Maps + Loaders = java.lang.NoClassDefFoundError

Walczę z tym od dwóch dni, mam nadzieję, że ktoś może pomóc.

Próbuję użyć najnowszego ActionBarSherlock (4.0) z MapView. Wiedziałem, że jest to problematyczne z fragmentami, ale nie potrzebuję ich w tym działaniu. Potrzebuję jednak ładowarek i wydaje się, że aby korzystać z ładowarek, muszę również rozszerzyć działanie FragmentActivity. Nie ma problemu, pomyślałem, mamy android-support-v4-googlemaps od Pete Doyle'a. Jak zasugerowano w wielu wątkach SO i Grupach dyskusyjnych Google, buduję system ABS z obsługą Androida-v4-googlemaps JAR (Android-support-v13-r7-googlemaps.jar) zamiast android-support-v4.jar. Potem użyłem go jako biblioteki do mojego projektu.

Teraz chciałbym mieć moja działalność w ten sposób:

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

Problem:

To kompiluje, ale wyrzuca błąd wykonania: E/AndroidRuntime(29159): java.lang.NoClassDefFoundError: ndl.klimczak.bananout.BananoutMapActivity

Rzeczy, które sprawdziłem trzykrotnie:

  • zarówno projekt biblioteki ActionBarSherlock i mój projekt jest skierowany do API Google 4.0.3
  • mam <uses-library android:name="com.google.android.maps" /> i mam go w tagu aplikacji.
  • ja też mam ten sam android-support-V13-R7-googlemaps.jar na drodze budowania mojego projektu
  • mam .BananoutMapActivity zadeklarowane w moim manifest

Co ciekawe:

  • Kiedy go uruchomić na emulatorze ICS to działa (pojawia się błąd na 2. * emulatory i moje urządzenie 2.3.7), na Honeycomb to działa zbyt pewnie, to kwestia pomocą ACL chyba

  • Kiedy usunąć implements LoaderCallbacks<ArrayList<EventItem>> część to działa zbyt, ale w ten sposób, że nie jestem w stanie wykorzystać LoaderManager

Dlaczego na ziemi błąd NoClassDefFoundError i jak zdobyć Ładowarki działa w moim MapCapableSherlockEnabledFragmentActivity ?

Odpowiedz

6

Należy użyć modułów ładujących z biblioteki wsparcia, a nie tych z platformy. Ponieważ są one dostępne tylko w systemie Android 3.0 lub nowszym, a włączenie ich do definicji klasy spowoduje, że program ładujący klasy pre-3.0 całkowicie odrzuci klasę. Przełączanie importu na warianty biblioteki pomocy powinno być wszystkim, co jest potrzebne.

Jeśli spojrzysz powyżej wyjątku w programie Logcat, powinieneś zobaczyć jeden lub więcej VerifyErrors, które opisują dokładnie, z jakimi problemami się to stało.

Można również użyć tylko bibliotekę android-support-v13 na Androidzie 3.2 i up (stąd v13 w jego imieniu).

+0

Właśnie o tym napisałem. Wydaje się być problemem. –

+0

Dokładnie! Po prostu nie mogę uwierzyć, że przeoczyłem coś tak oczywistego! Dziękuję Ci bardzo! Oprócz tego używam wersji kompatybilnej z Pete Doyle'em biblioteki googlemaps, która zawiera również v4, więc pomyślałem, że to nie będzie problem (i nie jest, gdy przełączam import). –

+0

Ah tak. Jest to dodatek (a nie ostateczny zamiennik) wersji v4, który zawiera specjalny adapter pagerów, który jest nieco bliższy ramie w celu optymalizacji. Dopóki go nie użyjesz, będziesz więcej niż w porządku. –

19

Przestarzała: Zgaduję, że problem zniknie z Google Maps Android API v2. Jeśli zdecydujesz się użyć przestarzałego v1, rozwiązanie znajduje się poniżej.


Więc Jake odpowiedział dokładnie problem, ale pomyślałem, że dobrze byłoby, aby ktoś ma bardziej lub mniej szczegółowy how-to. Co zrobić, aby ActionBarSherlock działał z mapami?

Zakładam, że masz ustawiony ActionBarSherlock i działasz jako projekt biblioteki, możesz znaleźć wiele tutoriali, jak to zrobić.

Jeśli tylko chcesz używać MapActivity z ActionBarSherlock - to proste:

  1. Pobierz Jake'a MapsPlugin https://github.com/JakeWharton/ActionBarSherlock-Plugin-Maps,
  2. umieścić go w folderze libs swojej aplikacji i umieścić go w ścieżce budowania.

Jeśli chcesz użyć MapView z funkcji Honeycomb jak fragmenty lub ładowarek:

  1. Pobierz android pakiet wsparcia Pete'a Doyle'a z Google Maps: https://github.com/petedoyle/android-support-v4-googlemaps,
  2. Zrób jar (jeśli pobrać pre skompilowane słoiki to tylko kwestia zmiany nazwy zip na jar, na wypadek gdybyś tego nie wiedział). Można pobrać wersję V13, zawiera v4,
  3. Wykonaj kopię biblioteki ActionBarSherlock w przestrzeni roboczej (nazwa to ActionBarSherlockMaps lub coś w tym rodzaju), po prostu nie zadzierać z pierwotnego, może trzeba go użyć później lub coś,
  4. Pamiętaj, aby zbudować zarówno ActionBarSherlockMaps i swój projekt przed najnowszymi API Google. Jeśli używasz Androida bez regularnego 4.0.3 API Google nie będzie działać
  5. Put słoik (np android-support-v13-R7-googlemaps.jar) w folderze libs nowych ActionBarSherlockMaps wykluczać Android wsparcia -v4.jar ze ścieżki kompilacji i obejmują android-support-v13-R7-googlemaps.jar
  6. Przy rewizji 7, musisz się błąd kompilacji w tym etapie w SherlockFragmentActivity. Znajdź numer protected void supportInvalidateOptionsMenu() i zmień jego widoczność na public (ten krok nie jest potrzebny w nowej wersji systemu ABS).
  7. Umieść ten sam plik w folderze libs swojego projektu, wyklucz android-support-v4.jar ze ścieżki budowania i dołącz android-support-v13-R7-googlemaps.jar
  8. Upewnij się umieścić <uses-library android:name="com.google.android.maps" /> w tagu aplikacji z pliku manifestu
  9. Używaj właściwych importu dla fragmentów, ładowarek i innych rzeczy! Powinieneś użyć np. import android.support.v4.app.LoaderManager; insted import android.app.LoaderManager;
  10. Ciesz ActionBarSherlock + Google Maps + Fragmenty + Ładowarka

To najlepszy obejście teraz, aż Google stawia mapy w bibliotece kompatybilności. Mam nadzieję, że zrobią to przed 4. * urządzeniami o numerach przewyższających 2 *. * ...

+1

Działa to świetnie! Korzystanie z ABS v4.2.0, krok nr 6 (zmiana widoczności supportInvalidateOptionsMenu) nie było wymagane, chociaż ... – Mudar

Powiązane problemy