我正在手动向网站发送请求,并在/**
* Increase the click area of this view
*/
fun View.increaseHitArea(dp: Float) {
// increase the hit area
val increasedArea = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, Resources.getSystem().displayMetrics).toInt()
val parent = parent as View
parent.post {
val rect = Rect()
getHitRect(rect)
rect.top -= increasedArea
rect.left -= increasedArea
rect.bottom += increasedArea
rect.right += increasedArea
parent.touchDelegate = TouchDelegate(rect, this)
}
}
中呈现响应的正文。为此,我使用了WebView
引擎的WebView
方法:
loadContent
这个问题是String bodyOfResponse = ...;
myWebView.getEngine().loadContent(bodyOfResponse);
的内容来自WebView
,而不是位置,因此它不知道如何解析我给它的内容的HTML中的相对链接:
String
<span onclick="document.location.href='/'">Home</span>
找不到WebView
所指的内容,因为我没有通过URL提供'/'
内容。有没有一种方法可以设置当前文档的位置(或我曾听说过的baseURI),以便我的WebView
知道如何解析相对路径? (我知道原始服务器的URL。)
我已经看到,在内容中使用绝对位置,而不是相对位置,足以使WebView
在该位置加载数据,但是我无法修改服务器并拥有它在所有HTML页面中为我提供绝对URL。
如果我能WebView
...那太好了,但我做不到。 :(
答案 0 :(得分:1)
等待WebEngine的Document完成加载,然后在<head>
内添加一个<base>元素:
String newBaseURL = "http://www.example.com/app";
myWebView.getEngine().getLoadWorker().stateProperty().addListener(
(obs, old, state) -> {
if (state == Worker.State.SUCCEEDED) {
Document doc = myWebView.getEngine().getDocument();
XPath xpath = XPathFactory.newInstance().newXPath();
try {
Element base = (Element) xpath.evaluate(
"//*[local-name()='head']/*[local-name()='base']",
doc, XPathConstants.NODE);
if (base == null) {
Element head = (Element) xpath.evaluate(
"//*[local-name()='head']",
doc, XPathConstants.NODE);
if (head == null) {
head = doc.createElement("head");
Element html = (Element) xpath.evaluate(
"//*[local-name()='html']",
doc, XPathConstants.NODE);
html.insertBefore(head, html.getFirstChild());
}
base = doc.createElement("base");
head.insertBefore(base, head.getFirstChild());
}
base.setAttribute("href", newBaseURL);
} catch (XPathException e) {
e.printStackTrace();
}
}
});
myWebView.getEngine().loadContent(bodyOfResponse);