web-dev-qa-db-ja.com

MapFragmentまたはMapView getMap()がLollipopでnullを返す

Android 4.xバージョンで問題なくGoogle Maps API v2を長い間使用しています。今、Nexusデバイス(5および7)に最新のLollipopビルドをインストールして具体化しようとしましたアプリ。

KitKiatではすべてが問題なく、私が説明している問題はLollipopでのみ表示されることを指摘しておきます。

私のXMLソースコードでは、MapFragment(Google Play Servicesライブラリバージョン6.1.11)を使用しています。

<fragment Android:id="@+id/map"
          Android:layout_width="match_parent"
          Android:layout_height="match_parent"
          Android:name="com.google.Android.gms.maps.MapFragment"/>

Javaコードでは、マップに到達するためにOnPause()メソッドをオーバーライドしています:

GoogleMap map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

この行では、NullPointerExceptionがスローされます。デバッガーアプリではフラグメントを見つけることができますが、GoogleMapを返すことはできません。私もMapViewを使用しようとしました。また、nullをスローします。私にとって最も奇妙なことは、アプリ自体には問題なくマップが読み込まれることですが、コードではそれを処理するために到達できません。

19
mroczis

私はまったく同じ問題を抱えていましたが、これが私にとってうまくいきました:

これを交換...

GoogleMap map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

これとともに...

GoogleMap map = getMapFragment().getMap();

次に、この悪い子を中に入れて、それを旋回させます...

private MapFragment getMapFragment() {
    FragmentManager fm = null;

    Log.d(TAG, "sdk: " + Build.VERSION.SDK_INT);
    Log.d(TAG, "release: " + Build.VERSION.RELEASE);

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop) {
        Log.d(TAG, "using getFragmentManager");
        fm = getFragmentManager();
    } else {
        Log.d(TAG, "using getChildFragmentManager");
        fm = getChildFragmentManager();
    }

    return (MapFragment) fm.findFragmentById(R.id.map);
}
60
Rhisiart

Googleは、次の方法を使用して地図を取得するためのより便利な方法を作成しました

    myMapFragment.getMapAsync(new OnMapReadyCallback) {
         @Override
         public void onMapReady(GoogleMap googleMap) {
             myMap = googleMap;
         }
    });
13
Exception

21のtargetSdkVersionの問題である可能性があります: https://code.google.com/p/Android-developer-preview/issues/detail?id=1947

ただし、getChildFragmentManager()に切り替えるとうまくいきました。

SupportMapFragmentのfindFragmentByIdはAndroid Studio でnullを返します

3
bubastis

isGooglePlayServicesAvailable を試して、nullが返される理由を確認しましたか? nullにはgetmapに多くの理由があります。これを使用して、nullを与える理由を確認してください

1
iGoDa