Edit: For a detailed how-to, check out my answer.
I'm struggling with it for two days now, hope someone can help.
I'm trying to use the newest ActionBarSherlock (4.0) with a MapView. I knew it's problematic with fragments, but I don't need them in this activity. But I need Loaders and it appears, that to use Loaders I have to extend the FragmentActivity too. No problem, I thought, we have the android-support-v4-googlemaps from Pete Doyle. As suggested on many SO threads and Google Groups I build the ABS with android-support-v4-googlemaps JAR (android-support-v13-r7-googlemaps.jar actually) instead of android-support-v4.jar. Then I used it as a library for my project.
Now, I would like to have my activity this way:
public class BananoutMapActivity extends SherlockFragmentActivity implements LoaderCallbacks<ArrayList<EventItem>>{
The problem:
It compiles, but throws a runtime error: E/AndroidRuntime(29159): java.lang.NoClassDefFoundError: ndl.klimczak.bananout.BananoutMapActivity
Things I've triple checked:
<uses-library android:name="com.google.android.maps" />
and I have it in the application tag..BananoutMapActivity
declared in my manifestWhat 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?
Deprecated: I guess the problem goes away with Google Maps Android API v2. If you decide to use deprecated v1, the solution is below.
So Jake answered the exact problem, but I thought that it would be useful for someone to have a more or less detailed how-to. So how to make ActionBarSherlock work with maps?
I assume you have ActionBarSherlock set up and working as a library project, you can find lots of tutorials on how to do it.
If you just want to use MapActivity with ActionBarSherlock - it's easy:
If you would like to use MapView with Honeycomb features like Fragments or Loaders:
protected void supportInvalidateOptionsMenu()
and change its visibility to public
(this step is not needed in new version of ABS)<uses-library android:name="com.google.android.maps" />
in the application tag of your Manifest fileimport android.support.v4.app.LoaderManager;
insted of import android.app.LoaderManager;
It's the best workaround for now, until Google puts maps in the compatibility library. I hope they'll do it before 4.* devices outnumber 2.*...
You need to use the loaders from the support library rather than the ones from the platform. Since those are only available on Android 3.0+ and the fact that you've included them in your class definition will cause the pre-3.0 classloader to reject your class outright. Switching your imports to the support library variants should be all that's needed for that.
If you look above the exception in Logcat you should see one or more VerifyErrors which will outline specifically what it took issue with.
You also can only use the android-support-v13
library on Android 3.2 and up (hence the v13
in its name).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With