C# Xamarin形成Android地图渲染器
我成功地为Xamarin iOS创建了一个ViewRenderer,现在我正在尝试为Android实现一个渲染器,下面是我需要在Android中实现的映射:C# Xamarin形成Android地图渲染器,c#,android,xamarin,xamarin.forms,C#,Android,Xamarin,Xamarin.forms,我成功地为Xamarin iOS创建了一个ViewRenderer,现在我正在尝试为Android实现一个渲染器,下面是我需要在Android中实现的映射: public class MapViewModel : Map { public static readonly BindableProperty LocationsProperty = BindableProperty.Create<MapViewModel, List<Branch>>(x
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);}
}
}
公共类MapViewModel:Map
{
公共静态只读BindableProperty位置property=BindableProperty.Create(x=>x.Locations,new List());
公共静态只读BindableProperty PinTappedCommandProperty=BindableProperty.Create(x=>x.PinTapped,null);
公共地图视图模型(列出位置)
{
地点=地点;
PinTapped=新命令(异步(x)=>
{
//等待导航。PopModalAsync();
var info=新信息视图((分支机构)x);
等待导航。PushAsync(信息);
});
}
公开名单地点
{
获取{return(List)GetValue(LocationsProperty);}
set{SetValue(LocationsProperty,value);}
}
公共指挥系统
{
获取{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);
}
}
[程序集:ExportRenderer(typeof(MapViewModel)、typeof(MapViewAndroid))]
公共类MapViewAndroid:ViewRenderer
{
私有全局::Android.Gms.Maps.MapView NativeMap{get{return Control;}}
公共MapViewAndroid()
{
}
受保护的覆盖无效OneElementPropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
var-map=e.NewElement;
var cmd=map.PinTapped;
设置NativeControl(NativeMap);
}
}
控件为空,因此我无法正确设置NativeControl,在应用程序输出中我读到:[art]JNI RegisterNativeMethods:尝试为kimo.CustomerApp.android.MapViewAndroid注册0个本机方法
。。。
我错过了什么才能让它发挥作用 谷歌地图可能需要一些时间来初始化。您需要等待它完全加载,然后才能使用它。还要确保您连接到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);
}
}
}
与iOS实现相比,似乎缺少对SetNativeControl的调用。也许你可以研究一下,问题是我的控件为空,所以我无法检索MapView并用它设置NativeControl。。。我一定错过了什么。