Google Play開発者サービスのv6.5.87を使用すると、getMapAsync()
を呼び出すとnullポインタ例外が発生します。 SupportMapFragment
のxmlレイアウトでFragment
を使用しています。
私のコード:
_SupportMapFragment mapFragment = (SupportMapFragment) getActivity()
.getSupportFragmentManager().findFragmentById(R.id.mapFragment);
mapFragment.getMapAsync(this);
_
注:古いGooglePlay開発者サービスのバージョンでgetMap()
を呼び出す場合は問題ありませんが、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()
について見ることができます。
これはフラグメント内でのみ機能します。アクティビティがあり、フラグメントgetChildFragmentManager()
がない場合は機能しません。
単に使用する
if (mapFragment != null) {
mapFragment.getMapAsync(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();
これは動作しますチェックしてください