8

Вопрос по android – ActionBarSherlock + Maps + Loaders = java.lang.NoClassDefFoundError

Edit: Для получения подробных инструкций, проверьтемой ответ.

Я борюсь с этим уже два дня, надеюсь, кто-нибудь может помочь.

Я пытаюсь использовать новейший ActionBarSherlock (4.0) с MapView. Я знал, что с фрагментами это проблематично, но они мне не нужны в этом упражнении. Но мне нужны Loaders, и кажется, что для использования Loaders мне нужно расширить FragmentActivity. Нет проблем, я думал, у нас естьAndroid-поддержка-v4-GoogleMaps от Пита Дойла. Как и предлагалось во многих SO-потоках и группах Google, я создаю ABS с помощью android-support-v4-googlemaps JAR (фактически, android-support-v13-r7-googlemaps.jar) вместо android-support-v4.jar. Затем я использовал его в качестве библиотеки для своего проекта.

Now, I would like to have my activity this way:

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

The problem:

Компилируется, но выдает ошибку времени выполнения:E/AndroidRuntime(29159): java.lang.NoClassDefFoundError: ndl.klimczak.bananout.BananoutMapActivity

Things I've triple checked:

  • both ActionBarSherlock library project and my project are targeted at Google APIs 4.0.3
  • I have <uses-library android:name="com.google.android.maps" /> and I have it in the application tag.
  • I also have the same android-support-v13-r7-googlemaps.jar in the build path of my project
  • I have .BananoutMapActivity declared in my manifest

What is interesting:

  • When I run it on an ICS emulator it works (the error appears on 2.* emulators and my 2.3.7 device), on Honeycomb it would work too probably, it's the question of using the ACL I guess

  • When I remove the implements LoaderCallbacks<ArrayList<EventItem>> part it works too, but this way I'm not able to use LoaderManager

Why on earth the NoClassDefFoundError error and how to get the Loaders working in my MapCapableSherlockEnabledFragmentActivity?

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от Michał K
  • Error: User Rate Limit Exceeded

    от
  • 19

    Deprecated: Думаю, проблема исчезнет сGoogle Maps Android API v2, Если вы решите использовать устаревшую версию v1, решение приведено ниже.

    Итак, Джейк ответил на точную проблему, но я подумал, что кому-то было бы полезно иметь более или менее подробные инструкции.So how to make ActionBarSherlock work with maps?

    Я предполагаю, что у вас есть ActionBarSherlock, настроенный и работающий как библиотечный проект, вы можете найти множество учебных пособий о том, как это сделать.

    Если вы просто хотите использовать MapActivity с ActionBarSherlock - это легко:

    Download Jake's MapsPlugin https://github.com/JakeWharton/ActionBarSherlock-Plugin-Maps, Put it in the libs folder of your app and include it in the build path.

    Если вы хотите использовать MapView с функциями Honeycomb, такими как фрагменты или загрузчики:

    Download Pete Doyle's android support package with google maps: https://github.com/petedoyle/android-support-v4-googlemaps, Make a jar (if you download pre-compiled jars it's just a matter of renaming zip to jar, in case you didn't know). You can get the v13 version, it includes v4, Make a copy of ActionBarSherlock library in the workspace (name it ActionBarSherlockMaps or something like this), just not to mess with the original one, you may have to use it later or something, Remember to build both ActionBarSherlockMaps and your project against the newest Google APIs. If you use regular Android 4.0.3 without Google APIs it won't work Put the jar (e.g. android-support-v13-r7-googlemaps.jar) in the libs folder of the new ActionBarSherlockMaps, exclude the android-support-v4.jar from the build path and include android-support-v13-r7-googlemaps.jar With revision 7, you'll have a compile error in this step in SherlockFragmentActivity. Find protected void supportInvalidateOptionsMenu() and change its visibility to public (this step is not needed in new version of ABS) Put the same jar in the libs folder of your project, exclude the android-support-v4.jar from the build path and include android-support-v13-r7-googlemaps.jar Make sure you put <uses-library android:name="com.google.android.maps" /> in the application tag of your Manifest file Make sure you use the right imports for your fragments, loaders and stuff! You should use e.g. import android.support.v4.app.LoaderManager; insted of import android.app.LoaderManager; Enjoy ActionBarSherlock + Google Maps + Fragments + Loaders

    Пока это лучший обходной путь, пока Google не поместит карты в библиотеку совместимости. Я надеюсь, что они сделают это до того, как 4. * число устройств превысит 2. * ...

  • 6

    Вам нужно использовать загрузчики из библиотеки поддержки

    а не из платформы. Поскольку они доступны только на Android 3.0+, и тот факт, что вы включили их в определение класса, приведет к тому, что загрузчик классов до версии 3.0 полностью отклонит ваш класс. Переключение импорта на варианты поддержки библиотеки должно быть всем, что для этого нужно.

    Если вы посмотрите выше исключения в Logcat, вы должны увидеть один или несколько VerifyErrors, в которых будет конкретно указано, с чем возникла проблема.

    Вы также можете использовать толькоandroid-support-v13 библиотека на Android 3.2 и выше (отсюдаv13 в его названии).