gpt4 book ai didi

包含 IFRAME 内超链接的 Android webview 无法正常工作

转载 作者:行者123 更新时间:2023-11-29 17:56:59 30 4
gpt4 key购买 nike

当嵌入到 Android WebView 中时,此示例中的超链接不起作用。有人可以解释为什么以及如何纠正它吗?它在桌面 Chrome 浏览器中运行良好。下面提供的示例 HTML 代码是从 Twitter 时间轴小部件生成的动态代码复制而来的。我无法控制 Twitter 时间轴小部件创建的 HTML,因此我需要一个解决此限制的解决方案。

这里是一个例子:

测试.html:

<iframe src="twitter.html"></iframe>

twitter.html:

<a href="http://t.co/zCcFf1SWtL" target="_blank" class="link media customisable" data-pre-embedded="true" dir="ltr">pic.twitter.com/zCcFf1SWtL</a>

Java代码:

webView.loadUrl("file:///android_asset/test.html");

实际的 Twitter 时间轴小部件 HTML:(这会注入(inject)上述 HTML 代码)

<a class="twitter-timeline" height="355" data-dnt="true" href="https://twitter.com/VectrenStorm" data-widget-id="367009971554095104">Tweets by @VectrenStorm</a>
!function (d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], p = /^http:/.test(d.location) ? 'http' : 'https'; if (!d.getElementById(id)) { js = d.createElement(s); js.id = id; js.src = p + "://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); } } (document, "script", "twitter-wjs");

最佳答案

显然这是 Android WebView 的限制。当 IFRAME 内的超链接上的 target="_blank"时,单击链接时不调用 ShouldOverrideUrlLoading。

作为解决方法,我实现了一个新的 WebChromeClient 类并覆盖了 onCreateWindow 方法。单击链接时会触发此方法;在 onCreateWindow 中,我创建了一个新的临时 webview 并将其分配给 WebViewTransport 消息,然后返回 true。我还为新的 WebView 分配了 WebViewClient 的自定义实现。创建新的 webview 时,会触发其 ShouldOverrideUrlLoading 方法。在 ShouldOverrideUrlLoading 方法中,我在原始 webview 上加载调用 loadUrl,然后销毁新的临时 webview。

这是一些代码(用 C#/mono 编写):

public class TwitterChromeClient : WebChromeClient
{
public override bool OnCreateWindow(WebView view, bool dialog, bool userGesture, Android.OS.Message resultMsg)
{
WebView newWebView = new WebView(view.Context);
newWebView.SetWebViewClient(new TempWebClient(view));
WebView.WebViewTransport transport = (WebView.WebViewTransport)resultMsg.Obj;
transport.WebView = newWebView;
resultMsg.SendToTarget();
return true;
}
}

public class TwitterWebClient : WebViewClient
{
public override bool ShouldOverrideUrlLoading(WebView view, string url)
{
//Unfortunately this method will never be called for links inside an iframe when target="_blank"
return true;
}
}

public class TempWebClient : WebViewClient
{
public WebView OriginalWebView { get; set; }

public TempWebClient(WebView originalWebView)
{
OriginalWebView = originalWebView;
}

public override bool ShouldOverrideUrlLoading(WebView view, string url)
{
OriginalWebView.LoadUrl(url);
OriginalWebView = null;
view.Destroy();
return true;
}
}

关于包含 IFRAME 内超链接的 Android webview 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18661372/

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