【问题标题】:Android Web View - shouldoverrideurlloading not calledAndroid Web 视图 - shouldoverrideurlloading 未调用
【发布时间】:2015-03-10 16:41:21
【问题描述】:

我正在使用 android web view 来加载一个 url。它工作正常,但问题是网页内的某些链接(target = _blank)没有打开默认方式。我调试了项目,发现这些链接没有在 webviewclient() 中调用 shouldoverrideurlloading() 方法。

这是webviewclient,

public class MyWebClient extends WebViewClient {

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

    }
}

【问题讨论】:

    标签: android webview webviewclient


    【解决方案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());
    

    【讨论】:

    • 那么它是在浏览器还是网页视图中打开?
    • @user3800832:这取决于您是否为popupWebView 设置了WebViewClient,以及您在其shouldOverrideUrlLoading 中执行的操作(与常规WebView 相同)。我在示例代码中添加了几行来说明这一点。
    • 以这种方式在浏览器中打开外部链接,但我想在网络视图中打开这些东西
    • @user3800832: popupWebView.setWebViewClient(new WebViewClient()); 成功了,你有吗?
    【解决方案2】:

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

    试试这个

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

    【讨论】:

    • 此方法在网页中的其他所有 url 中都能完美运行。问题是一些外部链接没有被调用。
    【解决方案3】:

    我发现如果你在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");
        }
    }   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      相关资源
      最近更新 更多