8

Editar: Para obtener detalles sobre cómo hacerlo, consulte my answer.ActionBarSherlock + Maps + Loaders = java.lang.NoClassDefFoundError

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

Estoy tratando de usar el nuevo ActionBarSherlock (4.0) con un MapView. Sabía que es problemático con fragmentos, pero no los necesito en esta actividad. Pero necesito los cargadores y parece que para usar los cargadores también tengo que extender FragmentActivity. No hay problema, pensé, tenemos el android-support-v4-googlemaps de Pete Doyle. Como se sugiere en muchos hilos SO y Grupos de Google, creo el ABS con android-support-v4-googlemaps JAR (android-support-v13-r7-googlemaps.jar en realidad) en lugar de android-support-v4.jar. Luego 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 tres veces:

  • tanto proyecto de biblioteca ActionBarSherlock y mi proyecto están dirigidos a las API de Google 4.0.3
  • <uses-library android:name="com.google.android.maps" /> tengo y lo tengo en la etiqueta de aplicación.
  • que también tienen el mismo android-apoyo-v13-R7-googlemaps.jar en la trayectoria de la estructura de mi proyecto
  • he declarado en mi .BananoutMapActivity manifiesta

Lo que es interesante:

  • Cuando lo ejecuto en un emulador ICS funciona (el error aparece en la 2. * emuladores y mi dispositivo 2.3.7), en el panal que funcionaría también probablemente, es la cuestión de la utilización de la ACL supongo

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

¿Por qué en la tierra el error NoClassDefFoundError y cómo llegar a los Cargadores de trabajo en mi MapCapableSherlockEnabledFragmentActivity ?

Respuesta

6

Debe usar los cargadores de la biblioteca de soporte en lugar de los de la plataforma. Ya que solo están disponibles en Android 3.0+ y el hecho de que los hayas incluido en la definición de tu clase hará que el cargador de clases pre-3.0 rechace tu clase por completo. Cambiar sus importaciones a las variantes de la biblioteca de soporte debería 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 delinearán específicamente con qué problema surgió.

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

+0

Estaba a punto de escribir esto. Parece ser el problema. –

+0

¡Exactamente! ¡No puedo creer que haya pasado por alto algo tan obvio! ¡Muchas gracias! Además, utilizo la versión v13 de la biblioteca de compatibilidad de googlemaps de Pete Doyle e incluye v4 también, así que pensé que no sería un problema (y no lo es cuando cambio las importaciones). –

+0

Ah sí. Es una adición (en lugar de un reemplazo directo) de la versión v4 que incluye un adaptador especial para buscapersonas que se pega un poco más al marco para la optimización. Mientras no lo uses, estarás más que bien. –

19

Obsoleto: Supongo que el problema desaparece con Google Maps Android API v2. Si decide utilizar v1 en desuso, la solución está a continuación.


Así Jake respondió el problema exacto, pero pensé que sería útil para alguien que tiene un más o menos detallada de cómo hacerlo. Entonces, ¿cómo hacer que ActionBarSherlock funcione con los mapas?

Supongo que tiene ActionBarSherlock configurado y trabajando como un proyecto de biblioteca, puede encontrar muchos tutoriales sobre cómo hacerlo.

Si lo que desea es utilizar MapActivity con ActionBarSherlock - es fácil:

  1. Descargar MapsPlugin de Jake https://github.com/JakeWharton/ActionBarSherlock-Plugin-Maps,
  2. ponerlo en la carpeta libs de su aplicación e incluirla en la trayectoria de la estructura.

Si desea utilizar MapView con características de nido de abeja como fragmentos o cargadoras:

  1. Descargar paquete de apoyo androide de Pete Doyle con los mapas de Google: https://github.com/petedoyle/android-support-v4-googlemaps,
  2. Hacer un frasco (si se descarga previa -jardines compilados es solo cuestión de cambiar el nombre de zip a jar, en caso de que no lo supiera). Puede obtener la versión v13, incluye v4,
  3. Haga una copia de la biblioteca ActionBarSherlock en el área de trabajo (asígnele el nombre ActionBarSherlockMaps o algo así), solo para no meterse con la original, puede que tenga que usarla más adelante o algo,
  4. Recuerde crear ambos ActionBarSherlockMaps y su proyecto contra las API más nuevas de Google. Si usa Android 4.0.3 sin las API de Google, no funcionará
  5. Ponga el jar (por ejemplo, android-support-v13-r7-googlemaps.jar) en la carpeta libs del nuevo ActionBarSherlockMaps, excluya el android-support -v4.jar desde la ruta de compilación e incluye android-support-v13-r7-googlemaps.jar
  6. Con la revisión 7, tendrá un error de compilación en este paso en SherlockFragmentActivity. Busque protected void supportInvalidateOptionsMenu() y cambie su visibilidad a public (este paso no es necesario en la nueva versión de ABS)
  7. Coloque el mismo jar en la carpeta libs de su proyecto, excluya android-support-v4.jar de la ruta de compilación e incluya android-apoyo-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 de manifiesto
  9. Asegúrese de que utiliza las importaciones adecuados para sus fragmentos, cargadoras y cosas! Debe usar, p. import android.support.v4.app.LoaderManager; insted de import android.app.LoaderManager;
  10. Disfrute ActionBarSherlock + Google Maps + Fragmentos + Cargadores

Es la mejor solución por ahora, hasta que Google pone mapas en la biblioteca de compatibilidad. Espero que lo hagan antes de que 4. * los dispositivos superen 2. * ...

+1

¡Esto funciona genial! No fue necesario usar ABS v4.2.0 paso # 6 (cambiando la visibilidad de supportInvalidateOptionsMenu) ... – Mudar

Cuestiones relacionadas