android - WebView使用loadDataWithBaseUrl跳转到 anchor

标签 android webview scroll anchor

我的 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/

相关文章:

android - 使用 Appbar 上的操作按钮作为选项卡。(Flutter)

javascript - uwp javascript x-ms-webview webkitfullscreenchange 事件

javascript - 运行我的 JS 脚本时,Android 5.0 WebView undefined is not a function 错误

java - 如何通过自动滚动将 JTextPane 的 Caret 位置居中?

java - 权限被拒绝导致 "Installation failed due to invalid APK file"

android - 居中的对话框标题名称

java - 如果不先滚动,则不会显示 RecyclerView 项目中的图像

c# - UWP Webview 仅触发最后一个请求的 NavigationCompleted 事件

iphone - 仅显示几张图像,滚动不顺畅

android - 寻找 iScroll 的替代品(iOS/Webkit 上的滚动 Div)