【问题标题】:Webview shouldOverrideUrlLoading not getting calledWebview shouldOverrideUrlLoading 没有被调用
【发布时间】:2015-10-20 12:39:51
【问题描述】:

我正在制作一个电子书阅读器,它使用 epub 格式将书籍加载到 webviews 中。 在某些书中,同一章节中的某些部分有一个锚链接。每章都以 html 格式加载。这就是链接的样子

file:///storage/sdcard0/Android/data/com.abc.reader/files/Download/498935/epub/resources/498935/OEBPS/#footnote-165093-1-backlink

我尝试使用shouldOverrideUrlLoading() 方法来获取回调,但它没有被调用,当我按下onPageFinished 中的链接时,URL 显示为about:blank

reader.setWebViewClient(new WebViewClient() {


    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        Log.w("TESTTESTOVERRIDE "+url);
        view.loadUrl(url);
        return false;
    }


    @Override
    public void onPageFinished(WebView view, String url) {
        // after the data has been loaded, the following is executed
        // TODO Auto-generated method stub
        super.onPageFinished(view, url);

            System.out.println("check.... onPageFinishedEntered.."
                    + url.toString());

            view.loadUrl(jsfileloadurl);




    }

有什么想法吗?

编辑:在 4.1 设备中,我正确获得了锚链接,但在 4.4 或 5.0 中,它大约是:空白。 (在这两种情况下都不会调用 shouldOverrideUrlLoading

【问题讨论】:

  • 你在 log cat 中检查过吗? shouldOverrideUrlLoading 没有被调用
  • 把它改成 ... return true; 然后再试一次..
  • 点击锚链接不会导致任何加载。浏览器只需滚动内容即可显示链接目标。
  • ok...den 怎么做。
  • 您是否在清单中设置了 targetSdkVersion?

标签: javascript android android-webview anchor


【解决方案1】:

我没有以编程方式对此进行测试,但我相信您正面临这个问题,因为在 OS 4.4 之后 webview 的工作方式发生了重大变化。你应该检查这个链接 https://developer.android.com/guide/webapps/migrating.html#URLs

在“自定义网址处理”部分下,它表示将不会为无效网址调用 shouldOverrideUrlLoading()。理想情况下,file:// 应该被视为有效的 url,但似乎这里没有发生。

一种可能的解决方案是使用 loadDataWithBaseURL 加载您的主要 webview 内容 并提供 baseurl 作为一些测试 url,例如http://mytestap.testurl ,它将保证 shouldOverrideUrlLoading 将一直被调用。下一步,如果在 shouldOverrideUrlLoading 回调中收到的 url 中存在前缀“http://mytestap.testurl”,则需要删除。

【讨论】:

    【解决方案2】:

    在我的情况下,由于网页上的 POST 请求,它不起作用。 shouldOverrideUrlLoading:

    注意:POST 请求不会调用此方法。

    注意:可以为子帧和非 HTTP(S) 调用此方法 计划;使用这样的 URL 调用 WebView#loadUrl(String) 将失败。

    改为覆盖shouldInterceptRequest(一个或两个版本)。另见https://medium.com/@madmuc/intercept-all-network-traffic-in-webkit-on-android-9c56c9262c85

    【讨论】:

      【解决方案3】:

      是的。 androgeek 先生答对了。 从 Android OS 4.4(KK) 开始,如果您实现了诸如 shouldOverrideUrlLoading() 或 shouldInterceptRequest() 之类的回调,则 WebView 仅针对有效 URL 调用它们。 如果您使用自定义 URL 并在您的控制下,那么您需要遵循 RFC 3986 标准来调用上述方法。请检查 RFC 3986 相关的 file:// 并更正您的 URL

      【讨论】:

        【解决方案4】:

        我不确定以下是否能解决您的问题。

        请在设置WebViewClient之前添加以下代码

        reader.getSettings().setLoadWithOverviewMode(true);
        reader.getSettings().setUseWideViewPort(true);
        
        /*This makes the layout/page rendering independent of the devices. 
        I use this to display local HTML pages.*/
        reader.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NORMAL); 
        

        此外,我还启用了缩放控件。请注意,我已经使用多种设备和品牌(HTC、三星、Nexus 等)从 API-10 开始测试了我的代码,发现shouldOverrideUrlLoading 一直有效。

        如果效果不佳,请尝试扩展 WebViewClient 并覆盖 shouldOverrideUrlLoading 方法

        class MyWebView extends WebViewClient{
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return false; //THis should be false always
            }
        }
        

        现在将 WebViewClient 设置为 reader.setWebViewClient(new MyWebView());

        【讨论】:

        • 你的目标和编译sdkversion是什么??
        • 我的目标版本是22,编译SDK版本是22。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-15
        • 2013-05-16
        • 2019-05-16
        • 1970-01-01
        相关资源
        最近更新 更多