我的Android应用程序使用WebView来显示一堆我“即时生成”的HTML代码。以下代码是用于加载HTML代码的:
StringBuilder builder = new StringBuilder();
// HTML
builder.append("<html><head><link rel=\"stylesheet\" href=\"file:///android_asset/style.css\" type=\"text/css\">");
builder.append("</link></head><body>");
builder.append(getThreadBody());
builder.append("</body></html>");
webview.loadDataWithBaseURL("file:///android_asset/", builder.toString(), "text/html", "utf-8", null);
这一切都运行得非常顺利。请注意,我没有加载实际的HTML文件,而只是创建了一个代表某些(希望有效的)HTML的字符串,并将其加载到WebView中。
无论如何,我生成的HTML(在“getThreadBody”方法中的部分)包含命名锚点,例如像这样;
<div>
<a name="949823">Anchor 1</a>
<div>All kinds of stuff</div>
<a name="895984">Anchor 2</a>
<div>...</div>
</div>
现在在某些情况下,我希望WebView在加载HTML时立即导航到其中一个锚点。据我所知,WebView支持导航(在这种情况下为滚动)到命名锚点,但问题在于没有人点击任何超链接来访问这些锚点,我希望WebView在加载时滚动(如果在加载HTML和滚动之间有短暂的延迟也没问题,我的重点是它不需要用户交互)。
我认为可以通过使用WebView的loadUrl方法并提供一个带有锚点的URL来实现此行为,例如:
webview.loadUrl("file:///android_asset/page.html#895984", ...)
然而,由于我没有将HTML保存到任何文件中,因此我无法使用这种方法……当然,将HTML保存到临时文件可能是一种解决方法,但我希望将其保留为最后的选择,肯定有更简单的方法吧?
我该如何实现呢?谢谢!
已解决 以下是可行的代码。我发现需要短暂延迟来让页面加载,然后再执行javascript,否则成功与否是有点50/50的……
StringBuilder builder = new StringBuilder();
// HTML
builder.append("<html><head><link rel=\"stylesheet\" href=\"file:///android_asset/style.css\" type=\"text/css\">");
builder.append("</link>");
builder.append("<script>");
builder.append("function scrollAnchor(id) {");
builder.append("window.location.hash = id;}");
builder.append("</script>");
builder.append("</head><body>");
builder.append(getThreadBody());
builder.append("</body></html>");
webContents.loadDataWithBaseURL("file:///android_asset/", builder.toString(), "text/html", "utf-8", null);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
String id = "895884";
webContents.loadUrl("javascript:scrollAnchor(" + id + ");");
}
}
}, 250);