【问题标题】:Add Mapbox to Android View in Xamarin Forms Custom Renderer在 Xamarin 表单自定义渲染器中将 Mapbox 添加到 Android 视图
【发布时间】:2016-04-21 03:22:56
【问题描述】:

我无法弄清楚如何使用 Xamarin.Forms 在 Android 上的自定义视图渲染器中获取 Mapbox 地图。这让我发疯了。

在我的 PCL 中,我有一个地图视图。

public class MapView: View
{
    public MapView() { }
}

对于 iOS,“入门”帮助已经足够接近,可以在 iOS 上运行,如下所示:

[assembly: ExportRenderer (typeof(Shared.Mobile.MapView), typeof(MapViewRenderer))]
namespace Clients.iOS
{
    public class MapViewRenderer : ViewRenderer<Shared.Mobile.MapView, UIView>
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Shared.Mobile.MapView> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement == null)
            {
                return;
            }

            var uiView = new UIView(new CoreGraphics.CGRect(0, 0, 500, 700));
            SetNativeControl(uiView);

            var mapView = new MapView(Control.Bounds);
            mapView.SetCenterCoordinate(new CoreLocation.CLLocationCoordinate2D(40.81, -96.68), false);
            mapView.SetZoomLevel(11, false);

            mapView.AddAnnotation(new PointAnnotation
                {
                    Coordinate = new CoreLocation.CLLocationCoordinate2D(40.81, -96.68), 
                    Title = "Lincoln, NE",
                    Subtitle = "What-what"
                });

            uiView.AddSubview(mapView);
        }
    }
}

在 Android 方面,没有那么多。 (https://components.xamarin.com/gettingstarted/mapboxsdk)。他们正在输入 XML 和各种 Activity,但我在移动设备方面的知识目前与 Xamarin.Forms 相差不远,所以我似乎无法弥合两者之间的差距。我的 Android 渲染器如下所示:

public class MapViewRenderer : ViewRenderer<Shared.Mobile.MapView, Android.Views.View>
{     
    protected override void OnElementChanged(ElementChangedEventArgs<Shared.Mobile.MapView> e)
    {
        base.OnElementChanged(e);

        var view = new Android.Views.View(Context);
        SetNativeControl(view);  // NullReferenceException will be thrown if the native control is not set

        if (Control == null)
        {
            return;
        }

        var mapView = new MapView(Forms.Context, "thisismyaccesscode");
        mapView.CenterCoordinate = new LatLng(41.885, -87.679);
        mapView.ZoomLevel = 11;
        mapView.SetMinimumHeight(250);
        mapView.SetMinimumWidth(250);
        mapView.AddMarker(new MarkerOptions().SetPosition(new LatLng(40.81, -96.68)).SetTitle("Lincoln, NE"));

        view.AddSubview(mapView) // I wish this method existed
    }
}

我对@9​​87654326@ 的最后调用实际上不是View 类的方法,因为它是iOS 上的UIView 类。这就是我卡住的地方。我不知道如何显示MapView。请帮忙。

【问题讨论】:

  • 您是否尝试按照链接中的建议创建 XML?这就是通常在 Android 上完成视图的方式。正如Xamarin docs 中提到的,您需要在`ÒnCreate()`` 中调用SetContentView()
  • 我确实尝试过,但没有成功,我没有深入研究它在 Android 上通常是如何完成的,而是尝试使用 xamarin.forms 路线(我有点熟悉的)。我会研究一下xml方法,看看我是否有更好的运气。
  • 您能否将您尝试过的内容添加到您的帖子中但没有成功?此外,Xamarin 在 [这篇文章中描述了如何在每个平台上自定义地图]。也许这会引导你走向一个方向。您是否还确保在您的平台特定代码中设置您的ExportRenderer
  • @Andy 你有没有取得更多进展?如果您仍然卡住,为什么不发送您的解决方案,我会快速浏览一下?我的联系方式在我的个人资料中。
  • @Pete 不,我没有。我接受了你的建议,它似乎更接近了,但应用程序在某些设备上立即崩溃,研究表明这是当前的 mapbox 错误。更重要的是,mapbox sdk 不会与最新的 xamarin.forms 版本一起运行。在这一点上,我没有时间再用 mapbox 搞砸了,所以可能只用原生地图。

标签: android xamarin xamarin.forms mapbox


【解决方案1】:

正如您已经提到的,您不能调用 AddSubview,因为它是 iOS 方法。

Android 上相当于AddView

但是 - 您正在尝试对 Android View 对象而不是 ViewGroup 对象执行此类操作,因此这是不可能的。

首先而不是做:-

var view = new Android.Views.View(Context);

尝试直接实例化 MapView,例如:-

var view = new MapView(Context, "thisismyaccesscode");

您对视图的SetNativeControl 调用很好。

我没有尝试过 Mapbox 组件,所以我不清楚上面代码中期望的确切参数类型。

但是,如果这不起作用,请执行以下操作:-

var view = new Android.Widget.FrameLayout(Context);

var mapView = new MapView(Forms.Context, "thisismyaccesscode");
mapView.CenterCoordinate = new LatLng(41.885, -87.679);
mapView.ZoomLevel = 11;
mapView.SetMinimumHeight(250);
mapView.SetMinimumWidth(250);
mapView.AddMarker(new MarkerOptions().SetPosition(new LatLng(40.81, -96.68)).SetTitle("Lincoln, NE"));

view.AddView(mapView);

SetNativeControl(view);

您还必须将第一行更改为以下内容:-

public class MapViewRenderer : ViewRenderer<Shared.Mobile.MapView, Android.Widget.FrameLayout>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    相关资源
    最近更新 更多