GoogleMap.setOnMapLoadedCallback未被调用问题求助
解决GoogleMap onMapLoaded未触发的问题
嘿,我仔细看了你的代码,发现MapView的生命周期处理完全不对,这就是onMapLoaded死活不触发的核心原因!咱们一步步来把问题搞定:
1. 先把MapView的生命周期和宿主绑定起来
你不能在display()方法里直接硬调用mapView.onCreate(null)和mapView.onResume()啊!MapView的生命周期必须和它所在的Activity/Fragment严格同步,不然地图组件根本没法正常初始化。
先给CustomMapView补全生命周期方法:
public class CustomMapView extends LinearLayout { private MapView mapView; private TextView textView; // 对了,你代码里的imageView没定义,要么补上要么删掉相关代码哈 // 构造方法和initialize保持不变,这里省略 // 新增这些生命周期方法,让宿主Activity/Fragment来调用 public void onCreate(Bundle savedInstanceState) { mapView.onCreate(savedInstanceState); } public void onResume() { mapView.onResume(); } public void onPause() { mapView.onPause(); } public void onDestroy() { mapView.onDestroy(); } public void onSaveInstanceState(Bundle outState) { mapView.onSaveInstanceState(outState); } public void onLowMemory() { mapView.onLowMemory(); } }
然后在你的宿主Activity里,对应调用这些方法(Fragment的话类似,用Fragment的生命周期方法):
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity_layout); CustomMapView customMapView = findViewById(R.id.custom_map_view); customMapView.onCreate(savedInstanceState); } @Override protected void onResume() { super.onResume(); customMapView.onResume(); } @Override protected void onPause() { super.onPause(); customMapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); customMapView.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); customMapView.onSaveInstanceState(outState); } @Override public void onLowMemory() { super.onLowMemory(); customMapView.onLowMemory(); }
2. 修复display方法里的错误逻辑
把display里的mapView.onCreate(null)和mapView.onResume()删掉,这俩现在交给宿主生命周期来处理了,修改后的display方法:
public void display(Place place) { mapView.setVisibility(View.VISIBLE); // 这里的imageView你没定义,记得处理一下 // imageView.setVisibility(View.GONE); mapView.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(final @Nonnull GoogleMap googleMap) { LatLng latLng = place.getLatLong(); googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 13)); googleMap.addMarker(new MarkerOptions().position(latLng)); googleMap.setBuildingsEnabled(true); googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); googleMap.getUiSettings().setAllGesturesEnabled(false); googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, googleMap.getMaxZoomLevel() - 4)); // 现在设置OnMapLoadedCallback应该能触发了 googleMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() { @Override public void onMapLoaded() { googleMap.snapshot(new GoogleMap.SnapshotReadyCallback() { @Override public void onSnapshotReady(Bitmap bitmap) { // 终于能进到这里啦!处理你的快照逻辑吧 } }); } }); } }); textView.setText(place.getDescription()); }
3. 最后再检查几个点
- 确认你的API Key在Google Cloud Console里已经启用了Maps SDK for Android和Places API,别漏开服务了
- 你用的GMS版本是15.0.1,虽然能用,但建议升级到新点的稳定版(比如20.x系列),旧版本可能有一些已知bug
- 布局里的MapView没有被其他View遮挡,你的merge布局看起来没问题
这样改完之后,onMapLoaded应该就能正常触发,快照回调也能执行了!
内容的提问来源于stack exchange,提问作者propoLis
相关产品推荐
相关产品推荐

