gpt4 book ai didi

c# - Xamarin:实例化 Xamarin.Droid 或 Xamarin.iOS 类

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:34 27 4
gpt4 key购买 nike

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

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

public interface ILocationTracker
{
void Connect();

void Disconnect();

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

}

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

  1. IGooglePlayServicesClientConnectionCallbacks,
  2. IGooglePlayServicesClientOnConnectionFailedListener,
  3. Android.Gms.Location.ILocationListener

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

为了类的实例化,我在 Xamarin.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

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

最佳答案

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

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

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

关于c# - Xamarin:实例化 Xamarin.Droid 或 Xamarin.iOS 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32117698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com