ravidl
ravidl

Reputation: 1095

Null pointer exception at mapFragment.getMapAsync(this) while initializing google map

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

Answers (6)

Darksymphony
Darksymphony

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

Bhupendra Singh
Bhupendra Singh

Reputation: 1

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

Upvotes: 0

Krishna
Krishna

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

Shree Krishna
Shree Krishna

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

ravidl
ravidl

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

ztan
ztan

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

Related Questions