ActionBarSherlock + Maps + Loaders = java.lang.NoClassDefFoundError

Изменить: для подробного инструктажа ознакомьтесь с моим ответом .

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

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

Теперь я хотел бы, чтобы моя деятельность была такой:

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" /> и у меня есть его в теге приложения.
  • У меня также есть тот же андроид-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+, и тот факт, что вы включили их в определение класса, заставит pre-3.0 classloader отказаться от вашего класса. Переключение импорта в варианты поддержки библиотеки должно быть всем необходимым для этого.

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

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

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


Поэтому Джейк ответил на конкретную проблему, но я подумал, что было бы полезно, если бы кто-то имел более или менее подробное руководство. Итак, как заставить ActionBarSherlock работать с картами?

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

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

  1. Загрузить Jake's MapsPlugin https://github.com/JakeWharton/ActionBarSherlock-Plugin-Maps ,
  2. Поместите его в папку libs вашего приложения и включите его в путь сборки.

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

  1. Загрузите пакет поддержки android для Pete Doyle с картами google: https://github.com/petedoyle/android-support-v4-googlemaps ,
  2. Сделайте банку (если вы загрузите предварительно скомпилированные банки, это просто вопрос переименования zip в банку, если вы не знаете). Вы можете получить версию v13, включая v4,
  3. Сделайте копию библиотеки ActionBarSherlock в рабочей области (назовите ее ActionBarSherlockMaps или что-то в этом роде), просто чтобы не испортить оригинальную, вам, возможно, придется использовать ее позже или что-то еще,
  4. Не забудьте создать как ActionBarSherlockMaps, так и ваш проект против новейших API Google. Если вы используете обычный Android 4.0.3 без API Google, это не сработает
  5. Поместите банку (например, android-support-v13-r7-googlemaps.jar) в папку libs новых ActionBarSherlockMaps, исключите поддержку android-support-v4.jar из пути сборки и включите поддержку android-support-v13-r7-googlemaps .jar
  6. С версией 7 у вас будет ошибка компиляции на этом этапе в SherlockFragmentActivity. Найдите protected void supportInvalidateOptionsMenu() и измените ее видимость на public (этот шаг не требуется в новой версии ABS)
  7. Поместите тот же банку в папку libs вашего проекта, исключите android-support-v4.jar из пути сборки и включите поддержку android-v13-r7-googlemaps.jar
  8. Убедитесь, что в теге приложения вашего файла манифеста помещен <uses-library android:name="com.google.android.maps" />
  9. Убедитесь, что вы используете правильный импорт для своих фрагментов, загрузчиков и прочее! Вы должны использовать, например, import android.support.v4.app.LoaderManager; Insted import android.app.LoaderManager;
  10. Наслаждайтесь ActionBarSherlock + Google Maps + Fragments + Loaders

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