ActionBarSherlock + Maps + Loaders = java.lang.NoClassDefFoundError

Editar: Para una detallada how-to, echa un vistazo a mi respuesta .

Estoy luchando con él durante dos días, espero que alguien pueda ayudar.

Estoy intentando utilizar el más nuevo ActionBarSherlock (4.0) con un MapView. Sabía que es problemático con fragmentos, pero no los necesito en esta actividad. Pero necesito Loaders y parece que para usar Loaders tengo que extender la FragmentActivity también. No hay problema, pensé, tenemos el android-support-v4-googlemaps de Pete Doyle. Como se sugirió en muchos subprocesos de SO y Grupos de Google, construyo el ABS con androide-support-v4-googlemaps JAR (android-support-v13-r7-googlemaps.jar en realidad) en lugar de android-support-v4.jar. Entonces lo usé como una biblioteca para mi proyecto.

Ahora, me gustaría tener mi actividad de esta manera:

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

El problema:

Compila, pero arroja un error de ejecución: E/AndroidRuntime(29159): java.lang.NoClassDefFoundError: ndl.klimczak.bananout.BananoutMapActivity

Cosas que he comprobado:

  • Tanto el proyecto de la biblioteca ActionBarSherlock como mi proyecto están dirigidos a las API de Google 4.0.3
  • Tengo <uses-library android:name="com.google.android.maps" /> y lo tengo en la etiqueta de la aplicación.
  • También tengo el mismo android-support-v13-r7-googlemaps.jar en la ruta de construcción de mi proyecto
  • Tengo .BananoutMapActivity declarado en mi manifiesto

Qué es interesante:

  • Cuando lo ejecuto en un emulador de ICS trabaja (el error aparece en 2. * emuladores y mi dispositivo 2.3.7), en el panal que trabajaría demasiado probablemente, él es la cuestión de usar el ACL que conjeturo

  • Cuando quito los implements LoaderCallbacks<ArrayList<EventItem>> parte que funciona también, pero de esta manera no soy capaz de usar LoaderManager

¿Por qué en la Tierra el error NoClassDefFoundError y cómo obtener los cargadores de trabajo en mi MapCapableSherlockEnabledFragmentActivity?

2 Solutions collect form web for “ActionBarSherlock + Maps + Loaders = java.lang.NoClassDefFoundError”

Es necesario utilizar los cargadores de la biblioteca de soporte en lugar de los de la plataforma. Dado que solo están disponibles en Android 3.0+ y el hecho de que los hayas incluido en la definición de clase hará que el cargador de clases pre-3.0 rechace tu clase de forma categórica. Cambiar sus importaciones a las variantes de la biblioteca de soporte debe ser todo lo que se necesita para eso.

Si miras por encima de la excepción en Logcat, deberías ver uno o más VerifyErrors que describirán específicamente lo que tuvo en cuenta.

También puede utilizar la biblioteca android-support-v13 en Android 3.2 y superior (de ahí la v13 en su nombre).

Deprecated : Supongo que el problema desaparece con Google Maps Android API v2 . Si decide utilizar v1 obsoleto, la solución se encuentra debajo.


Así que Jake respondió al problema exacto, pero pensé que sería útil que alguien tuviera un método más o menos detallado. Entonces, ¿cómo hacer que ActionBarSherlock funcione con los mapas?

Supongo que tiene ActionBarSherlock configurar y trabajar como un proyecto de biblioteca, puede encontrar un montón de tutoriales sobre cómo hacerlo.

Si sólo desea utilizar MapActivity con ActionBarSherlock – es fácil:

  1. Descargue el MapsPlugin de Jake https://github.com/JakeWharton/ActionBarSherlock-Plugin-Maps ,
  2. Póngalo en la carpeta libs de su aplicación e incluya en la ruta de construcción.

Si desea utilizar MapView con características de Honeycomb como Fragmentos o Cargadores:

  1. Descargue el paquete de soporte de Android de Pete Doyle con google maps: https://github.com/petedoyle/android-support-v4-googlemaps ,
  2. Hacer un tarro (si descarga jarras pre-compiladas es sólo una cuestión de renombrar zip a jar, en caso de que no sabía). Usted puede obtener la versión v13, que incluye v4,
  3. Hacer una copia de la biblioteca ActionBarSherlock en el espacio de trabajo (el nombre de ActionBarSherlockMaps o algo así), sólo para no ensuciar con el original, puede que tenga que usarlo más tarde o algo así,
  4. Recuerde crear tanto ActionBarSherlockMaps como su proyecto con las API más recientes de Google. Si usas Android 4.0.3 normal sin las API de Google, no funcionará
  5. Ponga el tarro (por ejemplo, android-support-v13-r7-googlemaps.jar) en la carpeta libs del nuevo ActionBarSherlockMaps, excluya android-support-v4.jar de la ruta de construcción e incluya android-support-v13-r7-googlemaps .tarro
  6. Con la revisión 7, tendrá un error de compilación en este paso en SherlockFragmentActivity. Buscar protected void supportInvalidateOptionsMenu() y cambiar su visibilidad a public (este paso no es necesario en la nueva versión de ABS)
  7. Ponga el mismo tarro en la carpeta de libs de su proyecto, excluya android-support-v4.jar de la ruta de construcción e incluya android-support-v13-r7-googlemaps.jar
  8. Asegúrese de poner <uses-library android:name="com.google.android.maps" /> en la etiqueta de aplicación de su archivo Manifest
  9. ¡Asegúrese de usar las importaciones adecuadas para sus fragmentos, cargadores y cosas! Debe utilizar, por ejemplo, import android.support.v4.app.LoaderManager; Insted de import android.app.LoaderManager;
  10. Disfruta de ActionBarSherlock + Google Maps + Fragmentos + Cargadores

Es la mejor solución por ahora, hasta que Google publique mapas en la biblioteca de compatibilidad. Espero que lo hagan antes de 4. * los dispositivos superan en número 2. * …

  • ¿Cómo centrar la cámara para que el marcador esté en la parte inferior de la pantalla? (Google map api V2 Android)
  • Android y Maps v2: ¿cómo obtengo la ubicación de los usuarios?
  • Google Maps API V2 'Error al cargar mapa. No se pudo contactar con Google Servers '
  • MapView en un fragmento (Honeycomb)
  • ¿Cómo iniciar la intención del mapa con un elemento de marcador / superposición en una latitud y longitud determinadas?
  • Encuentra la posición de los marcadores en google map mientras mueve las posiciones de la cámara
  • Android: MapController.zoomToSpan: Hacer span dado una distancia y punto central
  • MyLocationOverlay dispatchTap () no se propaga
  • Map v2 SupportMapFragment dentro de Viewpager
  • NullpointerException al llamar a getSystemService (Context.LOCATION_SERVICE) y onLocationChanged no se llama
  • MapView dentro de ScrollView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.