我的 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”方法中的部分)包含命名 anchor ,例如这样;
<div>
<a name="949823">Anchor 1</a>
<div>All kinds of stuff</div>
<a name="895984">Anchor 2</a>
<div>...</div>
</div>
现在在某些情况下,我希望 WebView 在我加载 HTML 后立即导航到其中一个 anchor 。据我了解 WebView 支持导航(在这种情况下滚动)到命名 anchor ,但要注意的是没有人单击这些 anchor 的任何超链接,我希望 WebView 在加载时滚动(如果有则没有问题是加载 HTML 和滚动之间的短暂延迟,我的观点是它不应该需要用户交互)。
我相信可以通过使用 WebView 的 loadUrl 方法并提供带有 anchor 的 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);
最佳答案
用JavaScript控制怎么样?我没有尝试过,但也许这是一个线索。
builder.append(getThreadBody());
builder.append("<script>window.location.hash="949823";</script>");
builder.append("</body></html>");
记得为 WebView 启用 javascript。
----补充回答----
我看到您使用 TimerTask 来加载 javascript,这很有效,但我认为还有另一种更好的方法。 WebView 有一个名为 onPageFinished 的回调,它会在 WebView 完成加载网页时触发。你可以在那里注入(inject)你的 JS。
webContents.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
String id = "895884";
webContents.loadUrl("javascript:scrollAnchor(" + id + ");");
}
});
希望这有用!
关于android - WebView使用loadDataWithBaseUrl跳转到 anchor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14062901/