Xamarin:实例化Xamarin.Droid或Xamarin.iOS类

时间:2015-08-20 11:59:33

标签: c# android xamarin xamarin.forms

我是Xamarin的新手,想在我的Xamarin.Forms应用程序中写下一个通用的跨平台代码,用于调用Xamarin.Droid或Xamarin.iOS中的平台特定实现。此平台特定实现用于使用平台的位置服务。

为此,我在我的Xamarin.Forms项目中定义了一个名为ILocationTracker的接口,如下所示:

public interface ILocationTracker
    {
        void Connect();

        void Disconnect();

        void startReceivingLocationUpdates(int priority, int fastestInterval, int interval);

    }

我在我的Xamarin.Droid项目文件夹中记下了一个名为 AndroidLocationTracker 的类,该文件夹实现了ILocationTracker接口,并遵循Android平台特定的接口:

  
      
  1. IGooglePlayServicesClientConnectionCallbacks,
  2.   
  3. IGooglePlayServicesClientOnConnectionFailedListener,
  4.   
  5. Android.Gms.Location.ILocationListener
  6.   

对于Android特定实施,我指的是以下链接:http://developer.xamarin.com/guides/android/platform_features/maps_and_location/location/

对于类的实例化,我在XViewrin.Forms文件夹中的MyView.xaml.cs中进行了以下操作:

    if (Device.OS == TargetPlatform.Android) {
                    var type = Type.GetType("MyProjectName.Droid.AndroidLocationTracker");
                    tracker = (ILocationTracker)Activator.CreateInstance(type);
}

但是,我得到运行时错误

  

java.lang.reflect.InvocationTargetException

有人可以帮助我,如何调用特定于平台的类? 我错过了什么吗?还是我走错了路?

1 个答案:

答案 0 :(得分:2)

在平台特定代码中创建特定于平台的服务(在您的情况下为AndroidLocationTracker)。 转到Android项目并在MainActivity.cs文件中创建实例。在依赖注入容器中注册您的实例。使用这种技术,您再也不需要像现在这样使用if (Device.OS == TargetPlatform.Android) {}

来请求当前平台

一个常见的容器是Mvx,并附带MVVMCross(https://github.com/MvvmCross/MvvmCross/wiki/Service-Location-and-Inversion-of-Control)。

Xamarin.Forms带来了自己的DependencyServicehttp://developer.xamarin.com/guides/cross-platform/xamarin-forms/dependency-service/)。您可以在文档中找到类注册的示例。您可以通过DependencyService.Get<ILocationTracker>()在共享代码中创建新实例。