it-swarm.com.ru

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

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

Мой код:

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

mapFragment.getMapAsync(this);

Примечание. Нет проблем при вызове getMap() в более старых версиях Служб Google Play, но 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)
10
ravidl

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

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

вместо

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

getChildFragmentManager () добился цели. 

32
ravidl

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

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

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

Не

class ="com.google.Android.gms.maps.MapFragment"
3
Shree Krishna

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

Реализовали ли вы функцию обратного вызова для вашей функции getMapAsync()

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

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

0
ztan

Заголовок

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

 SupportMapFragment supportMapFragment

ДОБАВЬТЕ ЭТО in МЕТОДОМ СОЗДАНИЯ ()

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

это будет работать, проверьте это

0
Bhupendra Singh