gpt4 book ai didi

android - 如何在内容缩小时更新自定义 WebView 高度请求

转载 作者:行者123 更新时间:2023-12-05 07:12:37 26 4
gpt4 key购买 nike

问题发生在 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的源代码,并使用自定义渲染器来调整 View 的大小。

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

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

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

在Android上看到很多话题说我们需要重新创建webview。还有其他解决办法吗?

最佳答案

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

我首先尝试使用返回主体高度的 JS 命令:document.body.scrollHeight。问题是一样的,它总是返回最大尺寸,但从未减小尺寸。

由于 JS 命令增加大小没有问题,我不得不将高度设置为 0,设置 100ms 延迟(任意)然后使用上面的 JS 命令获取 HTML 的高度并设置 View 的高度请求

有了这个,HTML body 的高度就不会降低了……它总是从 0 开始增加到 HTML body 的大小。

最终结果:

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());
}
}
}

关于android - 如何在内容缩小时更新自定义 WebView 高度请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60399897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com