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
相关产品推荐
相关产品推荐

