5

I'm trying to load SupportMapFragment dynamically in a fragment, here is my onCreateView() method:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
            View contentView = inflater.inflate(R.layout.frag_map_layout, null);
            shopDtos=ShopListFragment.shopDtos;
            fragment =SupportMapFragment.newInstance();
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.replace(R.id.map_content, fragment);
            ft.commit();
            map = fragment.getMap();
            mapMarker = map.addMarker(new MarkerOptions().position(new LatLng(0, 0))
                    .icon(BitmapDescriptorFactory
                            .fromResource(R.drawable.maps_pin)));
        return contentView;
    }

Unfortunately, I get the GoogleMap map as null. Any suggestions on to how create a mapfragment dynamically?

Aditya
  • 1,693
  • 19
  • 27
ranjith
  • 4,526
  • 5
  • 27
  • 31
  • Check logs, most likely you have not enabled google maps API in play services console. – PravinCG Oct 07 '13 at 07:44
  • no.. its loading when we add frgment directly to the xml file... but.... the problem is that... frgment.getmap() returns null.. so that i cant add markers to the map – ranjith Oct 07 '13 at 07:47
  • possible duplicate of [Initialize MapFragment programmatically with Maps API v2](http://stackoverflow.com/questions/13733299/initialize-mapfragment-programmatically-with-maps-api-v2) – Kristopher Johnson Nov 07 '13 at 22:54

6 Answers6

13

map takes some time to load, so you need to run your code in handler -->

Handler handler = new Handler();
handler.postDelayed(new Runnable() 

   @Override
   public void run() {
       GoogleMap googleMap = SupportMapFragment.newInstance(new GoogleMapOptions().zOrderOnTop(true)).getMap();
       FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.map_content, fragment);
        ft.commit();
       if(googleMap != null) {
          googleMap.addMarker(new MarkerOptions().position(result)).setVisible(true);

          // Move the camera instantly to location with a zoom of 15.
          googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(result, 15));

          // Zoom in, animating the camera.
          googleMap.animateCamera(CameraUpdateFactory.zoomTo(14), 2000, null);

          googleMap.getUiSettings().setZoomControlsEnabled(false);
          googleMap.getUiSettings().setCompassEnabled(false);
          googleMap.getUiSettings().setMyLocationButtonEnabled(false);

          handler.removeCallbacksAndMessages(null);
       }

       else {
            handler.postDelayed(this, 500);
       }
 }, 500);
mrsus
  • 5,446
  • 4
  • 31
  • 44
3

Just try using the following code. It worked for me.

public class MapFragment extends SupportMapFragment {

    GoogleMap mapView;
    private Context context;

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

    @Override
    public View onCreateView(LayoutInflater mInflater, ViewGroup arg1,
        Bundle arg2) {
        View view = super.onCreateView(mInflater, arg1, arg2);

        return view;
    }

    @Override
    public void onInflate(Activity arg0, AttributeSet arg1, Bundle arg2) {
        super.onInflate(arg0, arg1, arg2);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        context = getActivity();
        mapView = getMap();
    }
}
Dennis Meng
  • 5,109
  • 14
  • 33
  • 36
2

There's a bunch of duplicate questions that go around the same topic... I can't seem to figure out how to flag it as a duplicate and then put one answer on it...

Here's the link to the other one: Android SupportMapFragment.getMap() returns null

And the potential answer posted there as well:

Check your layout xml file. I noticed that I wasn't referencing: android:name="com.google.android.gms.maps.SupportMapFragment" but rather: android:name="com.google.android.gms.maps.MapFragment"

The name should be: android:name="com.google.android.gms.maps.SupportMapFragment"

Community
  • 1
  • 1
technocrat
  • 3,513
  • 5
  • 25
  • 39
1

It happened with me once in a new purchased device with Google play services not yet installed /updated. With other notes mentioned of course also consider this one.

MSaudi
  • 4,442
  • 2
  • 40
  • 65
1

An up to date solution for this problem is to use getMapAsync (OnMapReadyCallback callback) instead.

Nima
  • 6,383
  • 7
  • 46
  • 68
0
getChildFragmentManager().findFragmentById(R.id.map)

Try getChildFragmentManager() in Fragment.

foxdot
  • 1
  • 2