我在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。 对我来说最奇怪的事情是地图加载没有问题的应用程序本身,但在代码我无法达到它使用它。
答案 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