一段时间以来,我一直在尝试使用共享库让ImageCell在非常基本的ListView中显示图像。该问题仅在Android上出现,iOS版本可正常使用。
PS:我也无法从Internet加载图像,同样仅适用于Android。我敢肯定问题是相同的。我已经在清单中添加了Internet权限,并尝试了所有不同的HttpClientImplementation和SSL / TLS实现选项。
我的XAML如下:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="TestXamarin.GreetPage">
<ListView x:Name="listView">
<ListView.ItemTemplate>
<DataTemplate>
<ImageCell Text="{Binding Name}" Detail="{Binding Status}" ImageSource="{Binding ImageUrl}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage>
类背后的代码是这样的:
public partial class GreetPage : ContentPage
{
public GreetPage()
{
On<iOS>().SetUseSafeArea(true);
InitializeComponent();
listView.ItemsSource = new List<Contact>
{
new Contact { Name="John", ImageUrl = "http://lorempixel.com/100/100/people/1" },
new Contact { Name="Jack", ImageUrl = "http://lorempixel.com/100/100/people/2", Status="Hello guys" },
new Contact { Name="Jill", ImageUrl = "http://lorempixel.com/100/100/people/3" }
};
}
}
Contact.cs类是这样:
public class Contact
{
public string Name { get; set; }
public string Status { get; set; }
public string ImageUrl { get; set; }
}
您的问题与具有非安全(http)连接的更高版本的Android的限制有关。
如果您调试应用程序并查看输出,您将看到如下消息:
图像加载:获取流的错误http://lorempixel.com/100/100/people/1:Java.IO.IOException:明文不允许通过lorempixel.com进行HTTP流量Java.Interop.JniEnvironment + InstanceMethods.CallVoidMethod(Java.Interop.JniObjectReference实例,Java.Interop.JniMethodInfo方法,Java.Interop.JniArgumentValue * args)[0x00069]在:0处Java.Interop.JniPeerMembers + JniInstanceMethods.InvokeAbstractVoidMethod(System.String编码的成员,Java.Interop.IJavaPeerable自我,Java.Interop.JniArgumentValue *参数)[0x00014]在:0处Java.Net.HttpURLConnectionInvoker.Connect()[0x0000a]在:0处Xamarin.Android.Net.AndroidClientHandler + <> c__DisplayClass44_0.b__0()[0x0005a] in:0 atSystem.Threading.Tasks.Task.InnerInvoke()[0x0000f]在:0处System.Threading.Tasks.Task.Execute()[0x00000]在0:---从先前引发异常的位置开始的堆栈跟踪---
如您所见,有消息说Cleartext HTTP traffic to lorempixel.com not permitted at
最快的解决方案是在Manifest.xml文件的应用程序级别添加android:usesCleartextTraffic="true"
:
<application android:label="MyApp.Android" android:usesCleartextTraffic="true">
...
</application>
但是以上内容不建议这样做,因为它在安全性方面存在漏洞。最好的解决方案是在Urls中使用https
。
希望这会有所帮助