我的 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);