Question

I am creating an App where I want to switch between my CustomMapFragment and a ListFragment. If I start the App and call replaceFragment:

private void replaceFragment(final Fragment fragment) {
    final FragmentManager fragmentManager = mActivity.getFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.main_content_frame, fragment)
            .commit();
}

with replaceFragment(new CustomMapFragment()) the Map looks like it should.

The CustomMapFragment is a Fragment where I replace a FrameLayout with the native MapFragment, to have it separated from the code.

If I call the replace method again on button click or something, with a different Fragment (the ListFragment for example), the FrameLayout gets replaced with this, everything is fine.

If I now try to replace it again with the CustomMapFragment, the exact same call like on the beginning, the Map is loaded but it is missing every Marker and every Setting I have done in the CustomMapFragment.

CustomMapFragment:

public class CustomMapFragment extends BaseFragment {

    private static final String LOG_TAG = PosMapFragment.class.getSimpleName();
    private MapFragment mMapFragment;
    private GoogleMap   mMap;
    private ImageLoader mImageLoader;

    private Context     mContext;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mContext = getActivity();

        final RequestQueue reqQueue = Volley.newRequestQueue(mContext);
        mImageLoader = new ImageLoader(reqQueue, new BitmapLruCache(mContext));
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.maps_fragment, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        mMapFragment = MapFragment.newInstance();
        replaceFragment(mMapFragment);
    }

    private void postMapInitialisation() {
        new View(getActivity()).post(new Runnable() {
            @Override
            public void run() {
                addTestMarker(0, 0, "http://www.jimis-cyberstore.com/store/media/gp_batman_tshirts.jpg");
                addTestMarker(10, 10, "http://img.netzwelt.de/software/icons/2012/8842/android-sdk.png");
                addTestMarker(50, 50, "http://fs02.androidpit.info/ali/x84/4053084-1374511678988-80x80.png");
                addTestMarker(5, 0, "http://im.wk.io/images/77e3e40/kitkat-chromium-ubernimmt-in-android.jpeg");
                addTestMarker(0, 10, "http://www.mchme.de/cms/kategorien/18_Software/dateien/fb_logo_80.jpg");
                addTestMarker(15, 5, "http://navigator.ptvgroup.com/uploads/pics/PTV_Navigator_Android_Windows2_80x80px_01.png");
            }
        });
    }

    @Override
    public void onResume() {
        super.onResume();
        setUpMapIfNeeded();
        postMapInitialisation();
        EventBusProvider.getInstance().register(this);
    }

    private void replaceFragment(final Fragment fragment) {
        final FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.maps, fragment)
                .commit();
    }

    private void setUpMapIfNeeded() {
        if (mMap == null) {
            mMap = mMapFragment.getMap();
            if (mMap != null) {
                mMap.setMyLocationEnabled(true);
                mMap.setInfoWindowAdapter(this);
                mMap.setOnInfoWindowClickListener(this);
            }
        }
    }

    private void addTestMarker(final double lat, final double lng, String url){
        if(mMap != null){
            final NetworkImageMarker networkImageMarker = new NetworkImageMarker(mContext, url);
            final Marker marker = mMap.addMarker(networkImageMarker.getMarkerOptions(lat, lng, mImageLoader));
            networkImageMarker.setMarker(marker);
            networkImageMarker.setReloadListener(new OnReloadListener() {
                @Override
                public void reAddNetworkImageMarker(Bitmap bitmap) {
                    mMap.addMarker(networkImageMarker.getMarkerOptions(lat, lng, bitmap));
                }
            });
        }
    }

    @Subscribe
    public void onLocationChanged(final LocationChangedEvent event) {
        centerMap(event.mLocation);
    }

    private void centerMap(Location location){
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();
        LatLng latLng = new LatLng(latitude, longitude);
        centerMapAtLocation(latLng);
    }

    private void centerMapAtLocation(LatLng location) {
        mMap.moveCamera(CameraUpdateFactory.newLatLng(location));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(14));
    }
}

The main layout is just a FrameLayout, which get replaced for different Fragments. I also tried to load just one Fragment where the CustomMapFragment and the ListFragment are loaded at the same time, with two FrameLayouts, so they are stacked over each other, but it ends up in the same behavior.

It seems there is something wrong with the MapFragment (not the SupportMapFragment).

  • loading MapFragment at the beginning = MapFragment looks perfect
  • MapFragment -> ListFragment -> MapFragment = MapFragment is an empty Map
  • ListFragment -> MapFragment = MapFragment is an empty Map
  • MapFragment -> MapFragment = MapFragment is an empty Map
Was it helpful?

Solution

Because you are trying to replace fragments inside of another fragment, you should use getChildFragmentManager() instead of getFragmentManager() in your replace method.

private void replaceFragment(final Fragment fragment) {
    final FragmentManager fragmentManager = getChildFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.maps, fragment)
            .commit();
}

Unfortunately getChildFragmentManager() is only supported for api lvl >= 17, so you will probably have to use the android-support-v4 library.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top