ActionBarSherlock + Maps + Loaders = java.lang.NoClassDefFoundError

编辑:有关详细的操作方法,请查看我的答案 。

我现在挣扎了两天,希望有人能帮上忙。

我试图用最新的ActionBarSherlock(4.0)与MapView。 我知道这是有问题的碎片,但我不需要他们在这个活动中。 但我需要装载机,看来,使用装载机,我也必须扩大FragmentActivity。 没问题,我想,我们有来自Pete Doyle的android-support-v4-google地图 。 正如在许多SO线程和Google网上论坛上所build议的那样,我使用android-support-v4-googlemaps JAR(实际上是android-support-v13-r7-googlemaps.jar)而不是android-support-v4.jar来构buildABS。 然后我用它作为我的项目的一个库。

现在,我想这样做我的活动:

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

问题:

它编译,但会引发一个运行时错误: E/AndroidRuntime(29159): java.lang.NoClassDefFoundError: ndl.klimczak.bananout.BananoutMapActivity

我三重检查的事情:

  • ActionBarSherlock库项目和我的项目都是针对Google API 4.0.3的
  • 我有<uses-library android:name="com.google.android.maps" /> ,我有它在应用程序标记。
  • 我的项目的构buildpath中也有相同的android-support-v13-r7-googlemaps.jar
  • 我有.BananoutMapActivity声明在我的清单

有趣的是:

  • 当我在一个ICS模拟器上运行它(它出现在2. *模拟器和我的2.3.7设备上的错误),在Honeycomb上它可能工作得太多了,这是使用ACL的问题,我猜

  • 当我删除implements LoaderCallbacks<ArrayList<EventItem>>部分它也可以,但是这样我就不能使用LoaderManager

为什么地球上的NoClassDefFoundError错误,以及如何让我的MapCapableSherlockEnabledFragmentActivity工作的加载器?

Solutions Collecting From Web of "ActionBarSherlock + Maps + Loaders = java.lang.NoClassDefFoundError"

您需要使用支持库中的装载程序,而不是平台上的装载程序。 由于这些只能在Android 3.0以上版本中使用,而且你已经将它们包含在你的类定义中会导致3.0之前的类加载器直接拒绝你的类。 将导入切换到支持库变体应该是所需要的。

如果您在Logcat中查看上面的exception,您应该看到一个或多个VerifyErrors,它将概述具体的问题。

您也只能在Android 3.2及更高版本上使用android-support-v13库(因此也就是其名称中的v13 )。

已弃用 :我猜Google Maps Android API v2的问题会消失。 如果您决定使用已弃用的v1,则解决scheme如下。


所以杰克回答了确切的问题,但我认为这将是有用的有一个或多或less的详细的方法。 那么如何让ActionBarSherlock和地图一起工作呢?

我假设你已经设置了ActionBarSherlock并作为一个库项目工作,你可以find很多关于如何做的教程。

如果你只是想用ActionBarSherlock来使用MapActivity,很简单:

  1. 下载杰克的MapsPlugin https://github.com/JakeWharton/ActionBarSherlock-Plugin-Maps
  2. 把它放在应用程序的libs文件夹中,并将其包含在构buildpath中。

如果您想要使用带有Honeycombfunction的MapView或Fragments或Loaders:

  1. 下载皮特多伊尔的Android支持包与谷歌地图: https : //github.com/ndedoyle/android-support-v4-googlemaps ,
  2. 制作一个jar文件(如果你下载了预编译的jar文件,只需要将zip文件重命名为jar文件,以防万一你不知道)。 你可以得到v13版本,它包括v4,
  3. 在工作区中创build一个ActionBarSherlock库的副本(将其命名为ActionBarSherlockMaps或类似的东西),只是不要弄乱原来的一个,你可能不得不使用它以后什么的,
  4. 请记住,要针对最新的Google API构buildActionBarSherlockMaps和您的项目。 如果您使用没有Google API的常规Android 4.0.3,则无法使用
  5. 把jar(例如android-support-v13-r7-googlemaps.jar)放到新的ActionBarSherlockMaps的libs文件夹中,从构buildpath中排除android-support-v4.jar并包含android-support-v13-r7-googlemaps 。jar
  6. 使用修订版本7,您将在SherlockFragmentActivity的这一步中出现编译错误。 findprotected void supportInvalidateOptionsMenu()并将其可见性更改为public (新版本的ABS中不需要此步骤)
  7. 将相同的jar放在项目的libs文件夹中,从构buildpath中排除android-support-v4.jar并包含android-support-v13-r7-googlemaps.jar
  8. 请确保在清单文件的应用程序标记中放置了<uses-library android:name="com.google.android.maps" />
  9. 确保你使用正确的import你的碎片,装载机和东西! 你应该使用例如import android.support.v4.app.LoaderManager; insed的import android.app.LoaderManager;
  10. 享受ActionBarSherlock +谷歌地图+片段+装载机

这是目前最好的解决方法,直到Google将地图放入兼容性库。 我希望他们会在4. *之前做到这一点。