MapFragment或MapView getMap()在Lollipop上返回null

时间:2014-10-27 17:05:46

标签: android google-play-services google-maps-android-api-2 android-5.0-lollipop

我在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()方法以达到map:

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

在此行抛出NullPointerException。在调试器应用程序中可以找到片段,但它无法返回GoogleMap。我也尝试过使用MapView。它也抛出null。 对我来说最奇怪的事情是地图加载没有问题的应用程序本身,但在代码我无法达到它使用它。

4 个答案:

答案 0 :(得分:60)

我有完全相同的问题,但这对我有用:

替换此......

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

答案 1 :(得分:13)

Google现在使用以下方法更方便地获取地图

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

答案 2 :(得分:3)

看起来这可能是targetSdkVersion为21的问题: https://code.google.com/p/android-developer-preview/issues/detail?id=1947

但是,切换到getChildFragmentManager()对我有用:

findFragmentById for SupportMapFragment returns null in Android Studio

答案 3 :(得分:1)

您是否尝试isGooglePlayServicesAvailable检查其返回null的原因? null在getmap上有很多原因,请尝试使用它来检查为什么它给出null