Xamarin.Forms.Mapsのバグを報告しようとしたら既にチケット上がってた
Xamarin.Forms.Maps.Mapのバグを発見しました。
AED検索アプリ作ってる途中で見つけた Xamarin.Forms.Maps のバグ、再現プロジェクト作って報告しようとしたら既に同様のチケットがあった。https://t.co/mYshXKozr4
— たまにXamarin.Forms解説マン (@ticktackmobile) 2016年2月26日
「Xamarin.Forms.Maps.MapのAndroid実装側で GoogleMap.CameraChange
イベントにハンドラを追加すると、 Map.VisibleRegion
(地図が表示してる範囲の情報)が更新されなくなる」というものバグを報告しようとしましたが、少し前に同様のチケットが登録されていたのでやめました。(バグ報告者になるチャンスを逃した)
せっかくなので確認コード上げときます。
実行するとMap.VisibleRegionの中味が常にnullになります。 ちなみにカスタムRendererの代わりにEffectでやると、中身は入ってるが更新されない状態になります。
ライブラリバージョン
- Xamarin.Forms 2.0.1
- Xamarin.Forms.Maps 2.0.1
- Xamarin.GooglePlayService 26.0.0
AndroidManifest等、地図を使うのに必要な準備は終わってるものとします。
Shared / PCL プロジェクトのコード
using System; using Xamarin.Forms; using Xamarin.Forms.Maps; namespace XFApp17 { public class MyMap : Map { } public class App : Application { public App() { var map = new MyMap(); var label = new Label { HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center, BackgroundColor = Color.Silver, TextColor = Color.White, InputTransparent = false, }; var button = new Button { Text = "Show VisibleRegion", HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.End, }; button.Clicked += (sender, e) => { if(map.VisibleRegion == null) { label.Text = "MyMap.VisibleRegion is null."; } else { label.Text = $"Latitude:{map.VisibleRegion.Center.Latitude}," + Environment.NewLine + $"Longitude:{map.VisibleRegion.Center.Longitude}, " + Environment.NewLine + $"Radius:{map.VisibleRegion.Radius.Meters}"; } }; MainPage = new ContentPage { Content = new Grid { Children = { map, label, button, }, }, }; } } }
Androidプロジェクトのコード
using System; using Xamarin.Forms; using Xamarin.Forms.Platform.Android; using Xamarin.Forms.Maps; using Xamarin.Forms.Maps.Android; using Android.Gms.Maps; using XFApp17; using XFApp17.Droid; [assembly:ExportRenderer (typeof(MyMap), typeof(MyMapRenderer))] namespace XFApp17.Droid { public class MyMapRenderer : MapRenderer, IOnMapReadyCallback { GoogleMap map; protected override void OnElementChanged(ElementChangedEventArgs<View> e) { base.OnElementChanged(e); if(e.OldElement != null) { map.CameraChange -= OnCameraChange; } if(e.NewElement != null) { ((MapView)Control).GetMapAsync(this); } } public void OnMapReady (GoogleMap googleMap) { map = googleMap; map.CameraChange += OnCameraChange; } void OnCameraChange (object sender, GoogleMap.CameraChangeEventArgs e) { Console.WriteLine("OnCameraChange"); } } }