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

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

Мой код:

 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) 

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

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

вместо

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

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

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

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

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

Не

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

В приложении 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(); } 

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

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

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

заголовок

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

  SupportMapFragment supportMapFragment" 

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

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

Это будет проверять это