Reputation: 1095
When I use v6.5.87 of Google Play Services, I get a null pointer exception when I call getMapAsync()
. I'm using a SupportMapFragment
in my Fragment
's xml layout.
My code:
SupportMapFragment mapFragment = (SupportMapFragment) getActivity()
.getSupportFragmentManager().findFragmentById(R.id.mapFragment);
mapFragment.getMapAsync(this);
Note: There's no problem when calling getMap()
on older Google Play Services versions, but getMap()
is now deprecated (docs).
Here's the stack trace for the NPE:
java.lang.NullPointerException
at com.decos.fixi.fragments.FragmentLocationMap.initializeMap(FragmentLocationMap.java:132)
at com.decos.fixi.fragments.FragmentLocationMap.onCreateView(FragmentLocationMap.java:95)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:454)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4921)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
at dalvik.system.NativeStart.main(Native Method)
Upvotes: 10
Views: 15189
Reputation: 2683
that will work only inside of a fragment. For those who have activity and not fragment getChildFragmentManager()
will not work.
Simply use
if (mapFragment != null) {
mapFragment.getMapAsync(this);
}
Upvotes: 0
Reputation: 1
run your program by adding this
SupportMapFragment supportMapFragment
ADD THIS in ON CREATE METHOD()
supportMapFragment = SupportMapFragment.newInstance();
FragmentManager fm = getFragmentManager();
fm.beginTransaction().replace(R.id.maplayout, new MapFragmentClass()).commit();
supportMapFragment.getMapAsync(this);
android.support.v4.app.FragmentManager sfm = getSupportFragmentManager();
sfm.beginTransaction().add(R.id.map,supportMapFragment).commit();
this will work check it
Upvotes: 0
Reputation: 1634
In AppCompatActivity extend
FragmentManager mFragmentManager = getSupportFragmentManager();
SupportMapFragment mVTMapFragment =(SupportMapFragment)mFragmentManager.findFragmentById(R.id.mapRideview);
mVTMapFragment.getMapAsync(this);
and implement onMapReady callback method
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
setUpMap();
}
Upvotes: 1
Reputation: 8562
In addition, If you are using SupportMapFragment mapFragment = (SupportMapFragment).....
Then be sure you have set this class
attribute in XML
class="com.google.android.gms.maps.SupportMapFragment"
Not
class ="com.google.android.gms.maps.MapFragment"
Upvotes: 3
Reputation: 1095
Finally I got the answer!
SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager()
.findFragmentById(R.id.mapFragment);
instead of
SupportMapFragment mapFragment = (SupportMapFragment) this.getSupportFragmentManager()
.findFragmentById(R.id.mapFragment);
getChildFragmentManager() did the trick.
Upvotes: 32
Reputation: 6921
Have you implement the callback function for your getMapAsync()
?
If not, You need to implement the onMapReady() method in your code, and then you can do adding markers or moving camera stuff in your onMapReady()
method.
You can see this example about onMapReady()
.
Upvotes: 0