在Android项目中将图像URL从Xamarin Forms PCL加载到PageRenderer失败

在Android项目中将图像URL从Xamarin Forms PCL加载到PageRenderer失败,xamarin,xamarin.android,custom-renderer,Xamarin,Xamarin.android,Custom Renderer,我正在从网站传递图像的URL字符串,这些图像显示在PCL项目的listview中,图像的URL可以很好地传递给Android自定义渲染器,但使用MonoDroidToolKit加载图像失败,错误如下: 未处理的异常: System.ArgumentNullException:值不能为null。 参数名称:key 从PCL(传递附件信息): 在Android自定义渲染器中: [assembly: ExportRenderer(typeof(ImageViewPage),typeof(ImageV

我正在从网站传递图像的URL字符串,这些图像显示在PCL项目的listview中,图像的URL可以很好地传递给Android自定义渲染器,但使用MonoDroidToolKit加载图像失败,错误如下:

未处理的异常:

System.ArgumentNullException:值不能为null。 参数名称:key

从PCL(传递附件信息):

在Android自定义渲染器中:

 [assembly: ExportRenderer(typeof(ImageViewPage),typeof(ImageViewRenderer))]
 namespace BibleCodesApp.Droid
 {
 public class ImageViewRenderer : PageRenderer
 {
    global::Android.Views.View view;
    ImageLoader imageLoader;
    Activity activity;
    ImageView imageView;

    private string imageItem
    {
        get
        {
            var imageViewPage = Element as ImageViewPage;
            return imageViewPage == null
                ? null
                : imageViewPage._imageItem;
        }
    }

  protected override void OnElementChanged(ElementChangedEventArgs<Page>e)
    {
        base.OnElementChanged(e);

        activity = this.Context as Activity;
       view =  activity.LayoutInflater.Inflate
       (Resource.Layout.ImageView,this,false);

        imageLoader = new ImageLoader(activity, 512);
        imageView = FindViewById<ImageView>(Resource.Id.image_view);
        imageLoader.DisplayImage(imageItem, imageView, -1);
     }

   }
}
[程序集:ExportRenderer(typeof(ImageViewPage)、typeof(ImageViewRenderer))]
名称空间BibleCodesApp.Droid
{
公共类ImageViewRenderer:PageRenderer
{
全局::Android.Views.View;
图像加载器;
活动;
图像视图图像视图;
私有字符串imageItem
{
得到
{
var imageViewPage=作为imageViewPage的元素;
返回imageViewPage==null
无效的
:imageViewPage.\u imageItem;
}
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgse)
{
基础。一个要素发生变化(e);
activity=this.Context作为活动;
视图=activity.LayoutInflater.充气
(Resource.Layout.ImageView,this,false);
imageLoader=新的imageLoader(活动,512);
imageView=findviewbyd(Resource.Id.image\u视图);
DisplayImage(imageItem,imageView,-1);
}
}
}
Android中的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="5dp">
    <BibleCodesApp.Droid.ScaleImageView
        android:id="@+id/image_view"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scaleType="center"
        android:adjustViewBounds="true" />
</LinearLayout>
</RelativeLayout>

我现在看到了: 您正在扩展新视图,但从未将其实际添加到页面中

你应该打电话

        this.ViewGroup.AddView(view);
在您的
imageLoader.DisplayImage
调用之后,在
OnElementChanged
的末尾,我现在看到了它: 您正在扩展新视图,但从未将其实际添加到页面中

你应该打电话

        this.ViewGroup.AddView(view);

imageLoader.DisplayImage
调用完
OnElementChanged
后,这是正确的解决方案:

[assembly: ExportRenderer(typeof(ZoomImage), typeof(ZoomImageRenderer))]
命名空间WPAppTemplate.Droid { 公共类ZoomImageRenderer:ImageRenderer { 私人动物图像(ZoomImage);; 私有scaleImage视图_scaleImage

    protected async override void OnElementChanged(ElementChangedEventArgs<Image> e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {
            _zoomImage = (ZoomImage)e.NewElement;

            // create the scale image and set it as the native control so it's available
            _scaleImage = new ScaleImageView(Context, null);
            _scaleImage.ZoomImage = _zoomImage;
            SetNativeControl(_scaleImage);
            await LoadImage();
        }
    }

    protected async override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if (e.PropertyName == ZoomImage.AspectProperty.PropertyName
            || e.PropertyName == ZoomImage.HeightProperty.PropertyName
            || e.PropertyName == ZoomImage.WidthProperty.PropertyName)
        {
            _scaleImage.ZoomToAspect();
        }
        else if (e.PropertyName == ZoomImage.SourceProperty.PropertyName)
        {
            await LoadImage();
            _scaleImage.ZoomToAspect();
        }
        else if (e.PropertyName == ZoomImage.CurrentZoomProperty.PropertyName)
        {
            _scaleImage.ZoomFromCurrentZoom();
        }
        else if (e.PropertyName == ZoomImage.MaxZoomProperty.PropertyName)
        {
            _scaleImage.UpdateMaxScaleFromZoomImage();
        }
        else if (e.PropertyName == ZoomImage.MinZoomProperty.PropertyName)
        {
            _scaleImage.UpdateMinScaleFromZoomImage();
        }
    }

    private async Task LoadImage()
    {
        var image = await (new ImageLoaderSourceHandler()).LoadImageAsync(_zoomImage.Source, Context);
        try
        {
            if (image != null && image.ByteCount > 0)
                _scaleImage.SetImageBitmap(image);
        }
        catch (Exception e)
        {
            // catch an image loading failure
            Console.WriteLine($"Unable to load bitmap. Exception: {e.Message}");
        }
    }
}
protected async override void OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(例如NewElement!=null)
{
_zoomImage=(zoomImage)e.NewElement;
//创建缩放图像并将其设置为本机控件,使其可用
_scaleImage=新的scaleImage视图(上下文,空);
_scaleImage.ZoomImage=\u ZoomImage;
SetNativeControl(_scaleImage);
等待LoadImage();
}
}
受保护的异步重写void OnElementPropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
如果(e.PropertyName==ZoomImageAspectProperty.PropertyName
||e.PropertyName==ZoomImageHeightProperty.PropertyName
||e.PropertyName==ZoomImageWidthProperty.PropertyName)
{
_scaleImage.ZoomToAspect();
}
else if(e.PropertyName==ZoomImage.SourceProperty.PropertyName)
{
等待LoadImage();
_scaleImage.ZoomToAspect();
}
else if(e.PropertyName==ZoomImageCurrentZoomProperty.PropertyName)
{
_scaleImage.ZoomFromCurrentZoom();
}
else if(e.PropertyName==ZoomImageMaxZoomProperty.PropertyName)
{
_scaleImage.UpdateMaxCalefromZoomImage();
}
else if(e.PropertyName==ZoomImage.MinZoomProperty.PropertyName)
{
_scaleImage.UpdateMinScaleFromZoomImage();
}
}
专用异步任务LoadImage()
{
var image=await(新的ImageLoaderSourceHandler()).LoadImageAsync(_zoomImageSource,Context);
尝试
{
if(image!=null&&image.ByteCount>0)
_scaleImage.SetImageBitmap(图像);
}
捕获(例外e)
{
//捕获图像加载失败
Console.WriteLine($“无法加载位图。异常:{e.Message}”);
}
}
}

这是正确的解决方案:

[assembly: ExportRenderer(typeof(ZoomImage), typeof(ZoomImageRenderer))]
命名空间WPAppTemplate.Droid { 公共类ZoomImageRenderer:ImageRenderer { 私人动物图像(ZoomImage);; 私有scaleImage视图_scaleImage

    protected async override void OnElementChanged(ElementChangedEventArgs<Image> e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {
            _zoomImage = (ZoomImage)e.NewElement;

            // create the scale image and set it as the native control so it's available
            _scaleImage = new ScaleImageView(Context, null);
            _scaleImage.ZoomImage = _zoomImage;
            SetNativeControl(_scaleImage);
            await LoadImage();
        }
    }

    protected async override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if (e.PropertyName == ZoomImage.AspectProperty.PropertyName
            || e.PropertyName == ZoomImage.HeightProperty.PropertyName
            || e.PropertyName == ZoomImage.WidthProperty.PropertyName)
        {
            _scaleImage.ZoomToAspect();
        }
        else if (e.PropertyName == ZoomImage.SourceProperty.PropertyName)
        {
            await LoadImage();
            _scaleImage.ZoomToAspect();
        }
        else if (e.PropertyName == ZoomImage.CurrentZoomProperty.PropertyName)
        {
            _scaleImage.ZoomFromCurrentZoom();
        }
        else if (e.PropertyName == ZoomImage.MaxZoomProperty.PropertyName)
        {
            _scaleImage.UpdateMaxScaleFromZoomImage();
        }
        else if (e.PropertyName == ZoomImage.MinZoomProperty.PropertyName)
        {
            _scaleImage.UpdateMinScaleFromZoomImage();
        }
    }

    private async Task LoadImage()
    {
        var image = await (new ImageLoaderSourceHandler()).LoadImageAsync(_zoomImage.Source, Context);
        try
        {
            if (image != null && image.ByteCount > 0)
                _scaleImage.SetImageBitmap(image);
        }
        catch (Exception e)
        {
            // catch an image loading failure
            Console.WriteLine($"Unable to load bitmap. Exception: {e.Message}");
        }
    }
}
protected async override void OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(例如NewElement!=null)
{
_zoomImage=(zoomImage)e.NewElement;
//创建缩放图像并将其设置为本机控件,使其可用
_scaleImage=新的scaleImage视图(上下文,空);
_scaleImage.ZoomImage=\u ZoomImage;
SetNativeControl(_scaleImage);
等待LoadImage();
}
}
受保护的异步重写void OnElementPropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
如果(e.PropertyName==ZoomImageAspectProperty.PropertyName
||e.PropertyName==ZoomImageHeightProperty.PropertyName
||e.PropertyName==ZoomImageWidthProperty.PropertyName)
{
_scaleImage.ZoomToAspect();
}
else if(e.PropertyName==ZoomImage.SourceProperty.PropertyName)
{
等待LoadImage();
_scaleImage.ZoomToAspect();
}
else if(e.PropertyName==ZoomImageCurrentZoomProperty.PropertyName)
{
_scaleImage.ZoomFromCurrentZoom();
}
else if(e.PropertyName==ZoomImageMaxZoomProperty.PropertyName)
{
_scaleImage.UpdateMaxCalefromZoomImage();
}
else if(e.PropertyName==ZoomImage.MinZoomProperty.PropertyName)
{
_scaleImage.UpdateMinScaleFromZoomImage();
}
}
P