使用 loadDataWithBaseURL 禁用 webview 中的链接

Posted

技术标签:

【中文标题】使用 loadDataWithBaseURL 禁用 webview 中的链接【英文标题】:Using loadDataWithBaseURL disables links in 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;
    
);

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

【问题讨论】:

【参考方案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 的图片和样式表。 你能检查一下这个***.com/questions/11188348/…【参考方案3】:

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

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

pointer-events: none;

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

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

【讨论】:

以上是关于使用 loadDataWithBaseURL 禁用 webview 中的链接的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 android 中使用 loadDataWithBaseURL() 方法显示图像?

Android v2.2-2.3.5:WebView:loadDataWithBaseURL:只会加载一次页面

Android:WebView loadDataWithBaseURL 不显示验证码图片

android webView 当用loadDataWithBaseURL加载本地html时如何实现后退到上一页面

我无法使用 javascript 从 android ajax 获取 responseText 的数据

Android WebView loadData读取两次才能显示的问题