ActionBarSherlock + Maps + Loaders = java.lang.NoClassDefFoundError

Mic*_*ł K 8 android android-maps actionbarsherlock android-loadermanager

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

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

我正在尝试将最新的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中的加载器工作?

Mic*_*ł K 19

不推荐使用:我猜这个问题会随着谷歌地图Android API v2而消失.如果您决定使用已弃用的v1,则解决方案如下.


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

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

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

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

如果您想将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 .罐
  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" />Manifest文件的应用程序标记
  9. 确保为您的碎片,装载机和东西使用正确的导入!你应该使用例如import android.support.v4.app.LoaderManager;instedimport android.app.LoaderManager;
  10. 享受ActionBarSherlock +谷歌地图+碎片+装载机

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


Jak*_*ton 6

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

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

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