Исключение нулевого указателя на mapFragment.getMapAsync(это) при инициализации карты google

Когда я использую v6.5.87 из Служб Google Play, я получаю исключение нулевого указателя при вызове getMapAsync(). Я использую SupportMapFragment в макете Fragment xml.

Мой код:

SupportMapFragment mapFragment = (SupportMapFragment) getActivity()
        .getSupportFragmentManager().findFragmentById(R.id.mapFragment);

mapFragment.getMapAsync(this);

Примечание. Нет проблем при вызове getMap() в старых версиях Google Play Services, но getMap() теперь устарел (docs).

Здесь трассировка стека для 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)

Ответ 1

Наконец, я получил ответ!

SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager()
                .findFragmentById(R.id.mapFragment);

вместо

SupportMapFragment mapFragment = (SupportMapFragment) this.getSupportFragmentManager()
                .findFragmentById(R.id.mapFragment);

getChildFragmentManager() сделал трюк.

Ответ 2

Кроме того, если вы используете SupportMapFragment mapFragment = (SupportMapFragment).....

Затем убедитесь, что вы установили этот атрибут class в XML

class="com.google.android.gms.maps.SupportMapFragment"

Не

class ="com.google.android.gms.maps.MapFragment"

Ответ 3

В приложении AppCompatActivity

FragmentManager mFragmentManager = getSupportFragmentManager();
SupportMapFragment mVTMapFragment =(SupportMapFragment)mFragmentManager.findFragmentById(R.id.mapRideview);
mVTMapFragment.getMapAsync(this);

и реализовать метод обратного вызова onMapReady

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    setUpMap();
}

Ответ 4

У вас есть функция обратного вызова для getMapAsync()?

Если нет, вам необходимо реализовать метод onMapReady() в вашем коде, а затем вы можете добавлять маркеры или перемещать материал камеры в ваш метод onMapReady().

Вы можете увидеть этот пример около onMapReady().

Ответ 5

Заголовок

запустите свою программу, добавив этот

 SupportMapFragment supportMapFragment"

ДОБАВИТЬ ЭТО в 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();

, это будет работать.