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

Xamarin Forms Google Map加载后无法更新,缩放移动显示网格

解决Xamarin.Forms Google Map移动/缩放无响应、显示网格的问题

嘿,看起来你在Xamarin.Forms开发Google Map功能时碰到了个棘手的问题:地图初始能正常显示,标记也没问题,还能定位到用户位置,但移动或缩放地图时毫无变化,放大到一定程度就只显示网格,不过标记还能在网格上正常显示。结合你贴的代码,我整理了几个针对性的解决方案:

1. 先检查Google Maps API密钥配置

这是最容易忽略的点!首先确认你的Android项目AndroidManifest.xml里正确配置了Google Maps API密钥,而且这个密钥已经在Google Cloud控制台启用了Maps SDK for Android服务,没有设置错误的API限制(比如IP限制、应用签名限制不对)。

正确的配置应该是这样的(放在<application>标签内):

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="你的有效API密钥"/>

2. 修复地图渲染器的OnMapReady实现

你的ExtendedMapRenderer里用了反射来调用基类的OnMapReady方法,这很容易出问题——Xamarin版本更新可能会改变基类方法的签名,导致反射失效,进而让地图的基础初始化逻辑没执行,瓦片加载失败。

直接替换掉那个反射方法,改成调用基类的OnMapReady:

void IOnMapReadyCallback.OnMapReady(GoogleMap googleMap)
{
    // 先调用基类的OnMapReady,确保Xamarin.Forms Maps的核心逻辑正常执行
    base.OnMapReady(googleMap);
    _map = googleMap;
    
    if (_map != null)
    {
        _map.MapClick += googleMap_MapClick;
        _map.MapLongClick += googleMap_MapLongClick;
        ((ExtendedMap)Element).OnReady();
    }
}

同时删掉那个InvokeOnMapReadyBaseClassHack反射方法,它完全没必要,还容易埋坑。

3. 补全页面OnAppearing的跨平台逻辑

你当前的OnAppearing只处理了WinPhone平台的逻辑,Android/iOS平台完全没处理地图初始化和添加标记的逻辑!这会导致非WinPhone平台上地图可能没正确加载数据。

修改OnAppearing方法,覆盖所有平台:

protected override void OnAppearing()
{
    base.OnAppearing(); // 一定要调用基类的OnAppearing
    
    aActIndicator.IsRunning = false;
    aActIndicator.IsVisible = false;
    
    if (Issue.IsNew == false)
    {
        var position = new Xamarin.Forms.Maps.Position(Issue.Latitude, Issue.Longitude);
        AddPin(position, Issue.Title, Issue.Description);
        MoveToPinLocation();
    }
    else
    {
        // 定位到默认位置
        map.MoveToRegion(MapSpan.FromCenterAndRadius(
            new Xamarin.Forms.Maps.Position(Location.Latitude, Location.Longitude), 
            Distance.FromMiles(1)));
        // 获取当前位置
        OnGetLocation();
    }
}

4. 调整地图控件的布局属性

你给ExtendedMap设置了固定的HeightRequest=100和WidthRequest=960,这在不同屏幕尺寸下会导致布局异常,甚至可能让地图控件无法正确渲染。建议移除固定宽高,只保留填充布局的属性:

map = new ExtendedMap.ExtendedMap() {
    IsShowingUser = true,
    VerticalOptions = LayoutOptions.FillAndExpand,
    HorizontalOptions = LayoutOptions.FillAndExpand // 新增这个,让地图填满父布局
};

同时确保父布局slMap的VerticalOptions和HorizontalOptions也设置为FillAndExpand,避免布局挤压。

5. 优化页面Disappearing的等待逻辑

你当前的OnDisappearing里无限等待bMapCtrlReady变为true,这可能导致页面无法正常销毁。给等待加个超时限制:

protected override async void OnDisappearing()
{
    if (Locator.IsListening)
    {
        await Locator.StopListeningAsync();
    }
    
    // 最多等待2秒,避免卡住
    int waitAttempts = 0;
    while (!bMapCtrlReady && waitAttempts < 4)
    {
        await Task.Delay(500);
        waitAttempts++;
    }
    
    base.OnDisappearing(); // 调用基类方法
}

按照上面的步骤逐一排查,应该就能解决地图移动/缩放无变化、显示网格的问题啦!

内容的提问来源于stack exchange,提问作者JsonDork

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:42:27