【问题标题】:Webview tries to open all links, but it should be opened in a browserWebview 尝试打开所有链接,但它应该在浏览器中打开
【发布时间】:2015-01-19 07:07:48
【问题描述】:

我有一个 webview,webview 可能包含具有两种不同类型链接的网页。我想要的是,如果用户单击包含http://webpagename.com 的链接,它应该在手机的浏览器中打开该链接。如果用户点击第二种类型的链接,它没有http://,他应该被重定向到一个新的活动。现在正在发生的事情是,http:// 的链接正在 web 视图和浏览器中打开。但是,没有http:// 的链接显示网页不可用

webview中处理onclick链接的代码:

// to know which link is clicked
            holder.webView.setWebViewClient(new WebViewClient() {
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url){
                    holder.webView.setWebViewClient(new WebViewClient() {
                        @Override
                        public WebResourceResponse shouldInterceptRequest (final WebView view, String url) {
                            if (url != null && url.startsWith("http://")) {
                                view.getContext().startActivity(
                                    new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
                                return null;
                            }
                            else {
                            Log.e("URL: ", url);
                            System.out.println(url.replace(url.substring(0,url.lastIndexOf("/")+1), ""));
                            return null;
                            }
                        }

                        /**
                         * Return WebResourceResponse with CSS markup from a String. 
                         */

                    });

                    return super.shouldOverrideUrlLoading(view, url);
                }
            });

我应该怎么做才能确保 http:// 链接始终在浏览器中打开,而其他链接打开活动但在 web 视图中没有打开?

【问题讨论】:

    标签: java android webview hyperlink onclick


    【解决方案1】:

    来自docs for WebViewClientshouldOverrideUrlLoading() 方法:

    退货

    如果宿主应用程序想要离开当前的 WebView 并自己处理 url,则返回 true,否则返回 false。

    由于您正在处理 WebView 的内容和对活动的重定向,因此此方法应显式返回 true,而不是 super 方法的返回值。

    从您的描述和代码来看,您似乎不需要覆盖shouldInterceptRequest() 方法。

    holder.webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url)
            {
                if (url != null && url.startsWith("http://"))
                {
                    view.getContext().startActivity(
                        new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
                }
                else
                {
                    Log.e("URL: ", url);
                    System.out.println(url.replace(url.substring(0, url.lastIndexOf("/") + 1), ""));
                    // Start your app's Activity here
                }
    
                return true;
            }
        });
    

    【讨论】:

    • 我改变了 return super.shouldOverrideUrlLoading(view, url);返回真;但它是一样的。没有帮助我
    • 是的,我刚刚仔细查看了您的代码。这有点奇怪。您不应该在 shouldOverrideUrlLoading() 方法中设置另一个 WebViewClient。在一个客户端中覆盖您需要的两种方法,并设置一次。
    • 我的意思是,如果它是一个 http url,则该 url 会按预期在浏览器中打开,但如果它是一个非 http 链接,那么它会显示在 webview 本身中找不到的页面
    • 哎呀,你是对的。我没有想。由于您正在处理这两种情况,无论如何该方法都应该返回true,因此将returns 从if-else 中取出并将return true; 放在方法的末尾。
    • 它的工作谢谢!我已经用新代码编辑了你的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2014-07-12
    • 2018-02-11
    • 2014-03-12
    • 2017-08-06
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多