MapView in a Fragment (Honeycomb) MapView in a Fragment (Honeycomb) android android

MapView in a Fragment (Honeycomb)


I've managed to resolve this by using TabHost in fragment.

Here is the idea (briefly):

  1. MainFragmentActivity extends FragmentActivity (from support library) and has MapFragment.

  2. MyMapActivity extends MapActivity and contain MapView.

  3. LocalActivityManagerFragment hosts LocalActivityManager

  4. MapFragment extends LocalActivityManagerFragment.

  5. And LocalActivityManager contains MyMapActivity activity in it.

Example implementation: https://github.com/inazaruk/map-fragment.


enter image description here


As discussed at Google Groups, Peter Doyle built a custom compatibility library supporting Google Maps too. android-support-v4-googlemaps

However, there's a downside too:

Currently, one downside is that ALL classes extending FragmentActivity are MapActivitys. Its possible to make a separate class (i.e. FragmentMapActivity), but it requires some refactoring of the FragmentActivity code.


Just to clarify the answer. I tried the approach suggested by inazaruk and ChristophK. Actually you can run any activity in a fragment - not just google maps. Here is the code which implements google map activity as a fragment thanks to inazaruk and ChristophK.

import com.actionbarsherlock.app.SherlockFragment;import android.view.Window;import android.app.LocalActivityManager;import android.content.Intent;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class MapFragment extends SherlockFragment {    private static final String KEY_STATE_BUNDLE = "localActivityManagerState";    private LocalActivityManager mLocalActivityManager;    protected LocalActivityManager getLocalActivityManager() {        return mLocalActivityManager;    }    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Bundle state = null;        if (savedInstanceState != null) {            state = savedInstanceState.getBundle(KEY_STATE_BUNDLE);        }        mLocalActivityManager = new LocalActivityManager(getActivity(), true);        mLocalActivityManager.dispatchCreate(state);    }    public View onCreateView(LayoutInflater inflater, ViewGroup container,            Bundle savedInstanceState) {            //This is where you specify you activity class        Intent i = new Intent(getActivity(), GMapActivity.class);         Window w = mLocalActivityManager.startActivity("tag", i);         View currentView=w.getDecorView();         currentView.setVisibility(View.VISIBLE);         currentView.setFocusableInTouchMode(true);         ((ViewGroup) currentView).setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);        return currentView;    }    @Override    public void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        outState.putBundle(KEY_STATE_BUNDLE,                mLocalActivityManager.saveInstanceState());    }    @Override    public void onResume() {        super.onResume();        mLocalActivityManager.dispatchResume();    }    @Override    public void onPause() {        super.onPause();        mLocalActivityManager.dispatchPause(getActivity().isFinishing());    }    @Override    public void onStop() {        super.onStop();        mLocalActivityManager.dispatchStop();    }    @Override    public void onDestroy() {        super.onDestroy();        mLocalActivityManager.dispatchDestroy(getActivity().isFinishing());    }}