Исключение нулевого указателя на 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();
, это будет работать.