【问题标题】:Xamarin Forms Android MapRendererXamarin 窗体 Android MapRenderer
【发布时间】:2015-04-10 20:18:23
【问题描述】:

我为 Xamarin iOS 成功创建了一个 ViewRenderer,现在我正在尝试为 Android 实现一个 Renderer,这是我需要在 Android 中实现的地图:

public class MapViewModel : Map
    {
        public static readonly BindableProperty LocationsProperty = BindableProperty.Create<MapViewModel, List<Branch>>(x => x.Locations, new List<Branch>());
        public static readonly BindableProperty PinTappedCommandProperty = BindableProperty.Create<MapViewModel, Command>(x => x.PinTapped, null);

        public MapViewModel(List<Branch> locations)
        {
            Locations = locations;
            PinTapped = new Command(async (x) =>
                {
                    //await Navigation.PopModalAsync();
                    var info = new InformationView((Branch)x);
                    await Navigation.PushAsync(info);
                });
        }

        public List<Branch> Locations
        {
            get { return (List<Branch>)GetValue(LocationsProperty); }
            set { SetValue(LocationsProperty, value); }
        }

        public Command PinTapped 
        {
            get {return (Command) GetValue(PinTappedCommandProperty); }
            set {SetValue(PinTappedCommandProperty, value);}
        }
    }

按照我为 iOS 所做的,我为 Android 做了这个:

[assembly: ExportRenderer (typeof (MapViewModel), typeof (MapViewAndroid))]
public class MapViewAndroid : ViewRenderer<MapViewModel, global::Android.Gms.Maps.MapView>
    {
        private global::Android.Gms.Maps.MapView NativeMap {get { return Control; } }

        public MapViewAndroid ()
        {
        }
        protected override void OnElementPropertyChanged (object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged (sender, e);
        }
        protected override void OnElementChanged (ElementChangedEventArgs<MapViewModel> e)
        {
            base.OnElementChanged(e);
            var map = e.NewElement;
            var cmd = map.PinTapped;
            SetNativeControl(NativeMap);
        }
}

控制是空的,所以我不能正确地SetNativeControl,在应用程序输出中我读到:[art] JNI RegisterNativeMethods: attempt to register 0 native methods for kimo.customersapp.android.MapViewAndroid... 我缺少什么让这个工作?

【问题讨论】:

  • 与您的 iOS 实现相比,似乎缺少对 SetNativeControl 的调用。也许你可以研究一下
  • 问题是我的 Control 是空的,所以我无法检索 MapView 并用它设置 NativeControl...我一定错过了其他东西。

标签: c# android xamarin xamarin.forms


【解决方案1】:

Google 地图可能需要一些时间来初始化。您需要等待它完全加载才能使用它。还要确保连接到 IOnMapReadyCallback,以便在地图可以使用时收到通知。

private GoogleMap NativeMap { get;set;}
protected override void OnElementPropertyChanged (object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    base.OnElementPropertyChanged (sender, e);
    if (e.PropertyName.Equals ("VisibleRegion")) {
        var targetElement = (Android.Gms.Maps.MapView)Control;
        if (NativeMap == null) {
            targetElement.GetMapAsync (this);
        }
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多