In the onCreate
method, I am making use of the SupportMapFragment
to show a map.
SupportMapFragment fragment = new SupportMapFragment();
getSupportFragmentManager().beginTransaction()
.add(android.R.id.content, fragment).commit();
In conjunction to this, I would like to add a marker. The problem is when the call to getMap
is null, when can I try again? Is there an event I can register for or is my approach in and of itself wrong?
mMap = ((SupportMapFragment)(getSupportFragmentManager().findFragmentById(R.id.map))).getMap();
if(mMap == null)
//what do I do here?
The map is in fact displaying on the phone however I appear to be having no luck in obtaining the reference to add markers.
UPDATE:
The reason I was creating the SupportMapFragment
via the constructor is because the typical setContentView
was crashing and did not work. This put me in the predicament where I could not obtain my reference in the onCreate
method since I was in fact creating the SupportMapFragment
at that time. In further investigation, it appears my setContentView
issue was a byproduct of not having both the Google-play-services jar AND the module/src set up as part of the overall project. Upon doing BOTH of these, setContentView
now works and I can obtain the reference via getMap()
as I would expect.
lots.xml...
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
LotsActivity.java...
public class LotsActivity extends FragmentActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lots);
GoogleMap mMap;
mMap = ((SupportMapFragment)(getSupportFragmentManager().findFragmentById(R.id.map))).getMap();
if(mMap == null)
//this should not occur now
}
I would comment on CommonsWare's answer but I don't have enough rep for that. Anyways, I was also having this problem that getMap() would return null in onActivityCreated. My setup is this: I have MainActivity that contains a fragment. In the onCreateView method of that fragment I created the SupportMapFragment and then added it to the fragment via the childFragmentManager. I kept reference to the SupportMapFragment and expected it to give me the map in onActivityCreated which it did not. The solution to that problem was to override the onActivityCreated of the SupportMapFragment but not the parent fragment. I did it like this in onCreateView:
I ended up extending the SupportMapFragment class and using a callback. The code is here:
I would rather have used an interface and override the onAttach(activity) method, but in my case, I didn't want the callback to go back to my MainActivity. I wanted it to return to an instance of Fragment. (The GoogleMap was essentially a fragment inside a fragment) I setup the callback and programmatically loaded the map with this. I would like to have set itsMapViewCreatedListener inside the constructor of MySupportMapFragment, but using anything other than parameterless constructors is discouraged.
And then, when I got the call back, I could get the map; no more null!
Last month (December 2014) Google gave official solution for this problem. In newest (6.5) Google Play Services :
With
getMapAsync(OnMapReadyCallback callback)
you can set up listener for when GoogleMap is ready. It is passed in callback and it is provided to be not-null.Google provided sample code for this:
and when initializing fragment:
when map is ready, you callback will be called
With the latest GoogleServices you can use MapFragment.getMapAsync. Directly from the docs
EDIT:
getMap
is deprecated nowThat depends upon the nature of the problem.
If you set up the
SupportMapFragment
via the<fragment>
element in the layout, you can callgetMap()
successfully inonCreate()
. But, if you create theSupportMapFragment
via the constructor, that's too soon -- theGoogleMap
does not yet exist. You can extendSupportMapFragment
and overrideonActivityCreated()
, asgetMap()
is ready by then.However,
getMap()
can also returnnull
for a bigger problem, such as Google Play Services not being installed. You would need to use something likeGooglePlayServicesUtil.isGooglePlayServicesAvailable()
to detect this condition and deal with it however you wish.You can also use
MapsInitializer.initialize(context);
if the problem is related to the libraries not being initialized.