缩小内容后如何更新自定义WebView高度请求

问题描述 投票:2回答:1

问题发生在Android上。

我已经为WebView实现了自定义渲染器,以根据其内容来调整高度请求的大小。

我是从xamarin论坛帖子中获得的。

[assembly: ExportRenderer(typeof(AutoHeightWebView), typeof(AutoHeightWebViewRenderer))]
namespace MyProject.Droid.Renderers
{
    public class AutoHeightWebViewRenderer : WebViewRenderer
    {

        public AutoHeightWebViewRenderer(Context context): base(context) {}

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement is AutoHeightWebView webViewControl)
            {
                if (e.OldElement == null)
                {
                    Control.SetWebViewClient(new ExtendedWebViewClient(webViewControl));
                }
            }
        }

        class ExtendedWebViewClient : Android.Webkit.WebViewClient
        {
            private readonly AutoHeightWebView _control;

            public ExtendedWebViewClient(AutoHeightWebView control)
            {
                _control = control;
            }

            public override async void OnPageFinished(Android.Webkit.WebView view, string url)
            {
                if (_control != null)
                {
                    int i = 10;
                    while (view.ContentHeight == 0 && i-- > 0) // wait here till content is rendered
                    {
                        await System.Threading.Tasks.Task.Delay(100);
                    }

                    _control.HeightRequest = view.ContentHeight;
                }

                base.OnPageFinished(view, url);
            }
        }
    }
}

基于某种逻辑,我更改了WebView的源并使用自定义渲染器调整视图的大小。

当增加大小时有效,但当内容大小小于之前的大小时则无效...

更清楚一点,如果我将WebView的源设置为200px高度的html文件,然后将其更改为1000px的html文件,则可以正常工作,并且可以看到所有内容。但是,如果我尝试返回到200px的html文件,由于内容在view.ContentHeight上没有变化,并且保持1000px的值,所以在下面得到了800px的空白空间。

我关注了这个问题/线程,但没有找到解决此问题的解决方案:https://github.com/xamarin/Xamarin.Forms/issues/1711

我在Android上看到了很多话题,说我们需要重新创建Webview。还有其他解决方案吗?

android xamarin xamarin.forms webview xamarin.android
1个回答
0
投票

我找到了一种基于this thread的方法。

我首先尝试使用JS命令返回车身高度:document.body.scrollHeight。问题是相同的,它总是返回最大大小,但从未减小大小。

由于JS命令可以毫无问题地增加大小,因此我必须将高度设置为0,设置100ms的延迟(任意),然后使用上面的JS命令获取HTML的高度,并设置HeightRequest为视图。

这样,HTML正文高度将不会减少...它将始终从0开始并增加到HTML正文大小。

最终结果:

public class AutoHeightWebViewRenderer : WebViewRenderer
{
    static AutoHeightWebView _xwebView = null;

    public AutoHeightWebViewRenderer(Android.Content.Context context) : base(context)
    {
    }

    class DynamicSizeWebViewClient : WebViewClient
    {
        public async override void OnPageFinished(Android.Webkit.WebView view, string url)
        {
            try
            {
                if (_xwebView != null)
                {
                    view.Settings.JavaScriptEnabled = true;
                    view.Settings.DomStorageEnabled = true;
                    _xwebView.HeightRequest = 0d;

                    await Task.Delay(100);

                    string result = await _xwebView.EvaluateJavaScriptAsync("(function(){return document.body.scrollHeight;})()");
                    _xwebView.HeightRequest = Convert.ToDouble(result);
                }
                base.OnPageFinished(view, url);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"{ex.Message}");
            }
        }
    }

    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
    {
        base.OnElementChanged(e);
        _xwebView = e.NewElement as AutoHeightWebView;

        if (e.OldElement == null)
        {
            Control.SetWebViewClient(new DynamicSizeWebViewClient());
        }
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.