Одно решение, которое я нашел, - это создать Android WebView внутри пользовательского средства визуализации страниц для Android.В этом примере страница с WebView называется MyPage
.
. На других платформах можно использовать обычную MyPage
Xamarin.Forms.Page с Xamarin.Forms.WebView или пользовательские средства визуализации WebView.Как упоминалось в вопросе, в Android пользовательский рендерер для WebView имеет проблемы с определенными типами страниц.
using Android.Content;
using Xamarin.Forms.Platform.Android;
using Android.Webkit;
using Android.Widget;
[assembly: Xamarin.Forms.ExportRenderer(typeof(MyPage), typeof(MyPageRenderer))]
namespace MyXamarinApp.Droid
{
public class MyPageRenderer : PageRenderer
{
WebView webView;
public MyPageRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Page> e)
{
base.OnElementChanged(e);
if (e.OldElement != null || Element == null)
{
return;
}
webView = new WebView(this.Context);
// If you're using AXML to “inflate” the layout, you would use something like this instead:
//webView = FindViewById<WebView>(Resource.Id.webview);
// Important: LayoutParameters don't do anything for the layout (because the parent Xamarin.Forms page is a FrameLayout and doesn't do any automatic layout), but leaving this out is what causes the problems
webView.LayoutParameters = new LinearLayout.LayoutParams(LayoutParams.FillParent, LayoutParams.FillParent);
// Here you can set the WebView settings, WebViewClient, CookieManager, AddJavascriptInterface etc.
webView.Settings.JavaScriptEnabled = true;
webView.LoadUrl("https://www.example.com/");
this.AddView(webView);
/*// The following works but breaks Xamarin.Forms:
Activity activity = this.Context as Activity;
activity.SetContentView(webView);*/
}
protected override void OnLayout(bool changed, int left, int top, int right, int bottom)
{
base.OnLayout(changed, left, top, right, bottom);
webView.Layout(left, top, right, bottom); // Important because LayoutParameters doesn't have an effect
}
}
}
Похоже, что исключение из строки webView.LayoutParameters = new LinearLayout.LayoutParams(LayoutParams.FillParent, LayoutParams.FillParent);
является причиной проблем с WebView.Возможно, этого не хватает в пользовательском рендерере Xamarin.Forms?