WebView中的shouldOverrideUrlLoading方法未被调用。

9

我正在制作一款电子书阅读器,使用epub格式将书籍加载到web视图中。在一些书籍中,存在指向同一章节中某些部分的锚点链接。每个章节都以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没有被调用。 - SRB Bans
将代码改为 return true;,然后再试一次。 - SRB Bans
点击锚链接不会导致任何加载。浏览器只是滚动内容以显示链接目标。 - Mikhail Naganov
好的...那么怎么做呢? - shine_joseph
你在清单文件中设置了targetSdkVersion吗? - Prasad
是的...它是14,编译SDK版本为21。 - shine_joseph
4个回答

15

我没有进行过程序化测试,但我相信您面临这个问题是因为操作系统4.4之后Webview的工作方式发生了重大改变。您应该检查此链接 https://developer.android.com/guide/webapps/migrating.html#URLs

在“自定义URL处理”一节中,它说invalid url不会调用shouldOverrideUrlLoading()。理想情况下file://应该被视为有效的url,但似乎在这里不是这样。

一个可能的解决方案是使用loadDataWithBaseURL加载您的主Webview内容,并将baseurl提供为一些测试网址,例如 http://mytestap.testurl 这将保证shouldOverrideUrlLoading每次都会被调用。接下来,您需要在shouldOverrideUrlLoading回调中删除接收到的url中的前缀'http://mytestap.testurl'。


3

0

是的。androgeek先生回答得很正确。 从Android OS 4.4(KK)开始,如果您实现了shouldOverrideUrlLoading()或shouldInterceptRequest()等回调函数,则WebView仅为有效的URL调用它们。 如果您正在使用自定义URL并且在您的控制下,则需要遵循RFC 3986标准来调用上述方法。请检查与RFC 3986相关的file://并纠正您的URL。


-3
我不确定以下内容是否能解决您的问题。
请在设置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); 

此外,我已启用缩放控件。请注意,我已在API-10及以上版本上使用多个设备和品牌(HTC、三星、Nexus等)测试了我的代码,并发现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());


你的目标和编译SDK版本是什么? - shine_joseph
我的目标版本是22,编译SDK版本也是22。 - Devendra Vaja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接