Webview shouldOverrideUrlLoading没有被调用

时间:2015-07-29 13:35:51

标签: javascript android android-webview anchor

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

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

我尝试使用shouldOverrideUrlLoading()方法接听回电,但是没有被调用,当我按下onPageFinished中的链接时显示为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

4 个答案:

答案 0 :(得分:10)

I haven't tested this programmatically but I believe you are facing this issue because there was major changes in how webview works post OS 4.4 . You should check this link https://developer.android.com/guide/webapps/migrating.html#URLs

Under section 'Custom Url Handling' it says that shouldOverrideUrlLoading() will not be invoked for invalid url. Ideally file:// should be treated as valid url but seems like it's not happening here.

One possible solution is to load you main webview content with loadDataWithBaseURL and provide baseurl as some test url e.g. http://mytestap.testurl , it will guarantee shouldOverrideUrlLoading will get invoked all time. As a next step you need to remove prefix 'http://mytestap.testurl' if exist in the received url in shouldOverrideUrlLoading callback.

答案 1 :(得分:2)

在我的情况下,由于网页上的POST请求而无法使用。 shouldOverrideUrlLoading

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:-2)

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

请在设置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());