ActionBarSherlock + Maps + Loaders = java.lang.NoClassDefFoundError

时间:2012-04-05 22:53:47

标签: android android-maps actionbarsherlock android-loadermanager

修改:有关详细操作方法,请查看my answer

我现在已经挣扎了两天,希望有人可以提供帮助。

我正在尝试将最新的ActionBarSherlock(4.0)与MapView一起使用。我知道片段存在问题,但我不需要它们。但我需要Loaders,看来,使用Loaders我也必须扩展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中的Loaders工作?

2 个答案:

答案 0 :(得分:19)

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


所以杰克回答了确切的问题,但我认为对某人有一个或多或少详细的操作方法会很有用。 那么如何让ActionBarSherlock与地图配合使用?

我假设您已将ActionBarSherlock设置为库项目,您可以找到许多有关如何操作的教程。

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

  1. 下载Jake的MapsPlugin https://github.com/JakeWharton/ActionBarSherlock-Plugin-Maps
  2. 将其放入应用的libs文件夹中,并将其包含在构建路径中。
  3. 如果您想将MapView与Fragcomb或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.jar
    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; import android.app.LoaderManager; {{1}} {}
    10. 享受ActionBarSherlock + Google地图+碎片+装载机
    11. 这是目前最好的解决方法,直到Google将地图放入兼容性库中。我希望他们能在4个之前完成。*设备数量超过2个。* ...

答案 1 :(得分:6)

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

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

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