web-dev-qa-db-ja.com

グーグルマップの初期化中のmapFragment.getMapAsync(this)でのnullポインター例外

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)
_
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()メソッドでマーカーを追加したりカメラのものを移動したりできます。

この例onMapReady()について見ることができます。

0
ztan

これはフラグメント内でのみ機能します。アクティビティがあり、フラグメントgetChildFragmentManager()がない場合は機能しません。

単に使用する

  if (mapFragment != null) {
            mapFragment.getMapAsync(this);
        }
0
Darksymphony

見出し

これを追加してプログラムを実行します

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

これは動作しますチェックしてください

0
Bhupendra Singh