10

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)
0

6 Answers 6

32

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.

Sign up to request clarification or add additional context in comments.

3 Comments

getChildFragmentManager() this method is not find.
Awesome! Worked for me as well.
Genius! Was looking for ages how to do this in my fragment.
3

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"

Comments

1

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();
}

Comments

0

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().

1 Comment

Thanks for reply ztan. But I've implemented OnMapReadyCallback which overrides onMapReady() method!
0

Heading

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

Comments

0

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);
        }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.