【问题标题】:Using loadDataWithBaseURL disables links in webview使用 loadDataWithBaseURL 禁用 webview 中的链接
【发布时间】:2019-12-01 13:29:03
【问题描述】:

我使用以下代码加载电子书的 html 内容,其中 templateString 包含连接到主文件中的样式表和图像的 html 内容。

String itemURL = "file://" + itemPath;
testWV.loadDataWithBaseURL(itemURL,  templateString, "text/html", "UTF-8", "about:blank");

我面临的问题是锚链接根本没有响应。

我注意到如果 itemURL 为空,或者如果我使用 loadData 而不是 loadDataWithBaseURL,链接可以工作,但我失去了图像的连接以及通过 itemURL 连接的样式。

请注意,webview 可见性始终设置为可见。 添加我在 webview 中添加了以下功能

this.getSettings().setJavaScriptEnabled(true);
this.requestFocusFromTouch();
this.setVerticalScrollBarEnabled(false);
this.setHorizontalScrollBarEnabled(false);
this.getSettings().setSupportZoom(true);
this.getSettings().setBuiltInZoomControls(true);
this.getSettings().setDisplayZoomControls(false);
this.getSettings().setAllowContentAccess(true);
this.getSettings().setAllowFileAccess(true);
this.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
this.getSettings().setAllowFileAccessFromFileURLs(true);
this.getSettings().setAllowUniversalAccessFromFileURLs(true);

这是为 webview 初始化的 onTouch 方法:

this.setOnTouchListener(new View.OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {

        WebView.HitTestResult hr = ((WebView)v).getHitTestResult();
        System.out.println("getExtra: "+hr.getExtra());
        // getExtra always gives null when webview loaded with loadDataWithBaseURL while it should give the url of the link pressed when the user touches a link

        return false;
    }
});

如果需要更多代码,我可以分享。

【问题讨论】:

    标签: android webview hyperlink loaddata


    【解决方案1】:

    WebViewClient 设置为您的webView 并在loadDataWithBaseURL 中加载数据并传递您的基本网址

    这将有助于将锚 url 加载到 webview

     webview.getSettings().setJavaScriptEnabled(true);
     webview.requestFocusFromTouch();
     webview.setWebViewClient(new MyWebClient());
    

    这里是WebViewClient

    class MyWebClient extends WebViewClient {
    
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
        }
    
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    
        public void onPageFinished(WebView view, final String url) {
        }
    }
    

    【讨论】:

    • 请问您试过了吗?因为我已经在使用上述所有方法了。
    • 是的,它对我有用,您的基本网址是否与您的 href 网址相同?
    • shouldOverrideUrlLoading 甚至没有被调用,并且没有 href 与传递给 loadDataWithBaseURL 的 url 不同
    • 您能否发布您用于 loadDataWithBaseURL 的代码
    • 我正在使用相同的代码。我可以知道你在锚标签点击时加载的基本 url 和 href url 是什么吗?
    【解决方案2】:

    您可以尝试加载 HTML 文本而不是提供如下 URL:-

     webview.loadDataWithBaseURL(null, htmltext, "text/html", "utf-8", null);
    

    【讨论】:

    • 感谢您的贡献,正如我在回答中提到的那样,我已经尝试过了,它实际上可以使文本可选。但是在没有 URL 的情况下,webview 无法再连接到通过 URL 定位的 html 的图片和样式表。
    【解决方案3】:

    似乎问题与 baseURL 无关,而是与连接到 WebView 的 css 文件有关。在没有 baseURL 的情况下,没有加载 css 文件,这使得脚注可以点击。

    导致问题的 css 文件中的代码行是:

    pointer-events: none;
    

    因此,如果有人正在寻找一种使 webview 非交互的方法,这是这样做的一种方法。

    感谢为此问题做出贡献的每一个人。

    【讨论】:

      猜你喜欢
      • 2016-09-22
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多