読者です 読者をやめる 読者になる 読者になる

ぴーさんログ

だいたいXamarin.Formsのブログ

Xamarin.Forms.Mapsのバグを報告しようとしたら既にチケット上がってた

Xamarin.Forms.Maps.Mapのバグを発見しました。

「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");
        }
    }
}