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

Xamarin.Forms Android端导航时ArcGIS MapView残留问题求助

Android端Xamarin.Forms ArcGIS MapView导航后残留问题解决方案

嘿,我之前也碰到过类似的ArcGIS MapView在Android平台的渲染残留问题,这大概率是因为Android上ArcGIS的MapView基于原生控件实现,页面导航时前一页的MapView没有被正确隐藏或释放资源,导致它的渲染层还留在屏幕上。结合你的代码,给你几个可行的解决方案:

1. 跳转前隐藏前页MapView,返回时恢复

在第一页的Button_Clicked方法里,跳转到第二页前先把当前的MapView设为不可见,避免它的渲染层残留:

private async void Button_Clicked(object sender, EventArgs e)
{
    map.GraphicsOverlays.Clear();
    // 跳转前隐藏MapView
    map.IsVisible = false;
    var page = new MapPages.MapPage((BindingContext as IntervencaoClass).Polygons);
    page.AcceptedMap += (send, graphics) => {
        var intervencao = BindingContext as IntervencaoClass;
        intervencao.Polygons = graphics;
        map.GraphicsOverlays.Add(graphics);
        Navigation.PopAsync();
    };
    await Navigation.PushAsync(page);
}

然后在第一页的OnAppearing方法里恢复MapView的可见性和地图绑定:

protected override void OnAppearing()
{
    base.OnAppearing();
    var mapViewModel = Resources["MapViewModel"] as MapViewModel;
    map.Map = mapViewModel.Map;
    map.IsVisible = true;
}

2. 利用页面生命周期释放MapView资源

在第一页的OnDisappearing事件里暂停MapView渲染,甚至临时从布局中移除它,彻底避免残留:

protected override void OnDisappearing()
{
    base.OnDisappearing();
    // 暂停渲染
    map?.PauseRendering();
    // 从AbsoluteLayout中移除MapView
    if(AbsoluteLayout.Children.Contains(map))
    {
        AbsoluteLayout.Children.Remove(map);
    }
}

protected override void OnAppearing()
{
    base.OnAppearing();
    // 重新添加MapView到布局并恢复渲染
    if(!AbsoluteLayout.Children.Contains(map))
    {
        AbsoluteLayout.Children.Add(map);
        AbsoluteLayout.SetLayoutBounds(map, new Rectangle(0, 0, 1, 0.6));
        AbsoluteLayout.SetLayoutFlags(map, AbsoluteLayoutFlags.All);
    }
    var mapViewModel = Resources["MapViewModel"] as MapViewModel;
    map.Map = mapViewModel.Map;
    map?.ResumeRendering();
}

3. 升级ArcGIS Runtime到最新稳定版

这类平台特定的渲染bug很多时候会在组件的新版本中被修复,你可以检查当前项目中Esri.ArcGISRuntime.Xamarin.Forms的NuGet包版本,升级到官方最新的稳定版试试。

4. 确保第二页MapView正确初始化

你提供的第二页XAML代码不完整,要确认第二页的MapView是否正确绑定了Map实例,比如:

<Grid>
    <esriUI:MapView x:Name="mapView" Map="{Binding Map, Source={StaticResource MapViewModel}}" />
</Grid>

同时在第二页的OnAppearing里强制刷新MapView:

protected override void OnAppearing()
{
    base.OnAppearing();
    mapView?.Invalidate();
}

另外还有个小排查点:检查两个页面的MapViewModel是不是单例实例?如果是同一个单例,可能会导致地图上下文冲突,建议每个页面使用独立的ViewModel实例,或者确保Map的生命周期管理正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:18:20