如何从 Xamarin.Forms 中的可移植类库项目调用位于 Android 项目内的方法

本文关键字:项目 调用 Android 方法 可移植 Xamarin Forms 类库 | 更新日期: 2023-09-27 18:36:06

这听起来可能是一个愚蠢的问题,但由于我对Xamarin很陌生,所以我会去做的。

所以我有一个Xamarin.Forms解决方案,还有一个Android项目和一个可移植类库。我从 MainActivity 调用起始页.cs在 Android 项目中,该项目本身从可移植类库项目中定义的表单调用第一页(通过调用 App.GetMainPage())。现在,我想在我的一个表单上添加一个单击事件以获取设备的当前位置。显然,要获得位置,我必须在Android项目中实现它。那么,如何从可移植类库项目中的单击事件调用 GetLocation 方法呢?任何帮助将不胜感激。很抱歉可能重复。

如何从 Xamarin.Forms 中的可移植类库项目调用位于 Android 项目内的方法

如果您使用 Xamarin.Forms.Labs,解决方案确实在提供的链接中。如果您只使用 Xamarin.Forms,则几乎与使用 DependencyService 必须执行的操作相同。这比看起来容易。http://developer.xamarin.com/guides/cross-platform/xamarin-forms/dependency-service/

建议阅读这篇文章,我几乎打破了我的大脑试图理解。http://forums.xamarin.com/discussion/comment/95717

为方便起见,这里有一个工作示例,如果您尚未完成工作,可以对其进行调整:

在 Xamarin.Forms 项目中创建一个接口。

using Klaim.Interfaces;
using Xamarin.Forms;
namespace Klaim.Interfaces
{
    public interface IImageResizer
    {
        byte[] ResizeImage (byte[] imageData, float width, float height);
    }
}

在安卓项目中创建服务/自定义渲染器。

using Android.App;
using Android.Graphics;
using Klaim.Interfaces;
using Klaim.Droid.Renderers;
using System;
using System.IO;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: Xamarin.Forms.Dependency (typeof (ImageResizer_Android))]
namespace Klaim.Droid.Renderers
{
    public class ImageResizer_Android : IImageResizer
    {
        public ImageResizer_Android () {}
        public byte[] ResizeImage (byte[] imageData, float width, float height)
        {
            // Load the bitmap
            Bitmap originalImage = BitmapFactory.DecodeByteArray (imageData, 0, imageData.Length);
            Bitmap resizedImage = Bitmap.CreateScaledBitmap(originalImage, (int)width, (int)height, false);
            using (MemoryStream ms = new MemoryStream())
            {
                resizedImage.Compress (Bitmap.CompressFormat.Jpeg, 100, ms);
                return ms.ToArray ();
            }
        }
    }
}

所以当你称之为:

byte[] test = DependencyService.Get<IImageResizer>().ResizeImage(AByteArrayHereCauseFun, 400, 400);

它执行 Android 代码并将值返回到您的表单项目中。