8

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

我这两天一直在苦苦挣扎,希望有人能帮忙。

我正在尝试将最新的 ActionBarSherlock (4.0) 与 MapView 一起使用。我知道片段有问题,但我在这个活动中不需要它们。但是我需要加载器,而且看来,要使用加载器,我也必须扩展 FragmentActivity。没问题,我想,我们有来自 Pete Doyle的android-support-v4-googlemaps 。正如许多 SO 线程和 Google 组所建议的那样,我使用 android-support-v4-googlemaps JAR(实际上是 android-support-v13-r7-googlemaps.jar)而不是 android-support-v4.jar 构建 ABS。然后我将它用作我的项目的库。

现在,我想以这种方式进行活动:

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" />并且我有它在应用程序标签中。
  • 我的项目的构建路径中也有相同的 android-support-v13-r7-googlemaps.jar
  • 我已经.BananoutMapActivity在我的清单中声明

有趣的是:

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

  • 当我删除implements LoaderCallbacks<ArrayList<EventItem>>它也可以工作的部分时,但是这样我就无法使用 LoaderManager

为什么会出现 NoClassDefFoundError 错误以及如何让加载程序在我的 MapCapableSherlockEnabledFragmentActivity 中工作?

4

2 回答 2

19

已弃用:我想Google Maps Android API v2会解决这个问题。如果您决定使用已弃用的 v1,则解决方案如下。


所以 Jake 回答了确切的问题,但我认为对于某人来说,或多或少详细的操作方法会很有用。那么如何让 ActionBarSherlock 与地图一起工作呢?

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

如果您只想将 MapActivity 与 ActionBarSherlock 一起使用 - 这很简单:

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

如果您想将 MapView 与 Fragments 或 Loaders 等 Honeycomb 功能一起使用:

  1. 使用谷歌地图下载 Pete Doyle 的 android 支持包:https ://github.com/petedoyle/android-support-v4-googlemaps ,
  2. 制作一个 jar(如果您下载预编译的 jar,只需将 zip 重命名为 jar,以防您不知道)。您可以获得 v13 版本,它包括 v4,
  3. 在工作区中复制 ActionBarSherlock 库(将其命名为 ActionBarSherlockMaps 或类似的名称),只是为了不与原始库混淆,您可能需要稍后使用它或其他东西,
  4. 请记住针对最新的 Google API 构建 ActionBarSherlockMaps 和您的项目。如果您使用没有 Google API 的常规 Android 4.0.3,它将无法工作
  5. 将jar(例如android-support-v13-r7-googlemaps.jar)放在新ActionBarSherlockMaps的libs文件夹中,从构建路径中排除android-support-v4.jar并包含android-support-v13-r7-googlemaps 。罐
  6. 在修订版 7 中,您将在 SherlockFragmentActivity 的这一步中遇到编译错误。查找protected void supportInvalidateOptionsMenu()并将其可见性更改为public(新版ABS不需要此步骤)
  7. 将相同的 jar 放在项目的 libs 文件夹中,从构建路径中排除 android-support-v4.jar 并包含 android-support-v13-r7-googlemaps.jar
  8. 确保你把<uses-library android:name="com.google.android.maps" />你的清单文件的应用程序标签
  9. 确保为片段、加载器和其他东西使用正确的导入!你应该使用例如import android.support.v4.app.LoaderManager;insted ofimport android.app.LoaderManager;
  10. 享受 ActionBarSherlock + Google Maps + Fragments + Loaders

这是目前最好的解决方法,直到 Google 将地图放入兼容性库中。我希望他们能在 4.* 设备数量超过 2.*...

于 2012-04-06T08:56:26.630 回答
6

您需要使用支持库中的加载器,而不是平台中的加载器。由于这些仅在 Android 3.0+ 上可用,并且您将它们包含在类定义中的事实将导致 3.0 之前的类加载器完全拒绝您的类。将您的导入切换到支持库变体应该是所有需要的。

如果您查看 Logcat 中的异常上方,您应该会看到一个或多个 VerifyErrors,它们将具体概述问题所在。

您也只能android-support-v13在 Android 3.2 及更高版本上使用该库(因此v13得名)。

于 2012-04-05T23:10:15.747 回答