You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:22:36