Xamarin.Forms: страница с преобразованиями CSS и смахиванием JS не работает в пользовательском рендерере Android WebView, когда это происходит в Chrome - PullRequest
0 голосов
/ 30 ноября 2018

В чем может быть причина того, что HTML-страница загружается через HTTPS с преобразованиями CSS и JavaScript, который использует «смахивание», чтобы не работать в пользовательском рендерере Xamarin.Forms Android WebView?

Страница работает нормально:Chrome на Android, Xamarin.Android WebView, Xamarin.Forms WebView.

Только при использовании пользовательского средства визуализации WebView на Android в соответствии с официальным руководством страница перестает работать.

В частности, именно такие страницы по какой-то причине не работают: https://www.irozhlas.cz/fotogalerie/7693434?fid=8301190

Найдены страницы другого типа, которые не отображаются правильно в настраиваемом устройстве рендеринга Android WebView: https://www.irozhlas.cz/ekonomika/kalkulacka-socialni-davky-exekuce_1811280900_jab -это заставляет меня поверить, что это проблема CSS, а не JS.

Я понимаю, что это довольно узкая область, но я уверен, что другие, должно быть, столкнулись с подобными проблемами.

Я пытался:

  • В журнале отсутствуют соответствующие ошибки или предупреждения.

  • Удаленная отладка в Chrome:тамнет никаких предупреждений или признаков того, почему это не сработает.Мне не удалось найти причину в JS или CSS страницы.

  • Обновление пакета Xamarin.Forms.

  • Настройка реализации HttpClientна Android (AndroidClientHandler).

  • Следующее, собранное из других ответов Stack Overflow и других мест, но это не имеет значения:

    webView.Settings.SetAppCacheEnabled(true);
    webView.Settings.DomStorageEnabled = true;
    webView.Settings.DatabaseEnabled = true;
    webView.Settings.LoadWithOverviewMode = true;
    webView.Settings.AllowFileAccess = true;
    webView.Settings.AllowContentAccess = true;
    
    webView.Settings.UseWideViewPort = true;
    webView.Settings.BuiltInZoomControls = true;
    webView.Settings.DisplayZoomControls = false;
    webView.Settings.SetSupportZoom(true);
    webView.Settings.DefaultTextEncodingName = "utf-8";
    
    webView.SetWebViewClient(new WebViewClient());
    webView.SetWebChromeClient(new WebChromeClient());
    

Использование Xamarin.Forms с настраиваемым средством визуализации для WebView должно быть эквивалентно использованию Xamarin.Android, но после дальнейшего изучения проект Xamarin.Android с WebView прекрасно работает со страницей, и поэтомупо умолчанию Xamarin.Forms WebView, таким образом, это, кажется, специфическая проблема пользовательского рендерера Xamarin.Forms WebView.

1 Ответ

0 голосов
/ 11 января 2019

Одно решение, которое я нашел, - это создать 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?

...