Android Web View - shouldoverrideurlloading未调用

时间:2015-03-10 16:41:21

标签: android webview webviewclient

我使用Android网页视图加载网址。它的工作正常,但问题是网页内部的一些链接(target = _blank)没有打开默认方式。我调试项目,发现这些链接没有在webviewclient()中调用shouldoverrideurlloading()方法。

这是webviewclient,

public class MyWebClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;

    }
}

3 个答案:

答案 0 :(得分:1)

这是因为此类链接会触发弹出窗口的打开(如果您在浏览器中,则会显示新选项卡)。默认情况下,在WebView中禁用打开弹出窗口。查看http://developer.android.com/reference/android/webkit/WebSettings.html#setSupportMultipleWindows(boolean)

您必须为主WebView设置WebChromeClient,然后提供一个空的新WebView,用于打开弹出窗口的内容。

这是您需要做的事情的本质:

webView.getSettings().setSupportMultipleWindows(true);

webView.setWebChromeClient(new WebChromeClient {
    @Override
    public boolean onCreateWindow(WebView view, boolean isDialog,
            boolean isUserGesture, Message resultMsg) {
        // Create a WebView
        WebView popupWebView = new WebView(view.getContext());
        // TODO: Put WebView into your view hierarchy, if needed.
        //
        // This is needed to open the url in the WebView.
        // Without the client, WebView will try to start a browser.
        popupWebView.setWebViewClient(new WebViewClient());
        WebView.WebViewTransport transport = 
            (WebView.WebViewTransport) resultMsg.obj;
        transport.setWebView(popupWebView);
        resultMsg.sendToTarget();
        return true;
    }
});

如果您还希望处理关闭弹出窗口,此答案包含更多代码:How to handle facebook like with confirm in android webview

顺便说一下,如果你只想在WebView中打开链接,就没有必要覆盖shouldOverrideUrlLoading,只需设置WebViewClient即可:

webView.setWebViewClient(new WebViewClient());

答案 1 :(得分:0)

这种方法没用。 它只会加载url并始终返回TRUE布尔值。

试试这个

webView.setWebViewClient(new WebViewClient());
webView.getSettings().setDomStorageEnabled(true);
webView.loadUrl("url");

答案 2 :(得分:0)

我发现,如果您使用的是iframe,则不会触发shouldOverrideUrlLoading()外部链接,除非您添加target="_top"(我没有尝试target="_blank"

以下JavaScript代码将此目标属性添加到每个链接。

function change_links_target()
{   
    var all_document_links = mFrameDocument.getElementsByTagName("a");
    for (i = 0; i < all_document_links.length; i++){
        all_document_links[i].setAttribute("target", "_top");
    }
}