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