Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Webview尝试打开所有链接,但应在浏览器中打开_Java_Android_Webview_Hyperlink_Onclick - Fatal编程技术网

Java Webview尝试打开所有链接,但应在浏览器中打开

Java Webview尝试打开所有链接,但应在浏览器中打开,java,android,webview,hyperlink,onclick,Java,Android,Webview,Hyperlink,Onclick,我有一个webview,webview可能包含一个带有两种不同类型链接的网页。我想要的是,如果用户单击包含http://webpagename.com它应该在手机浏览器中打开链接。如果用户单击第二种类型的链接,该链接没有http://,则应将其重定向到新活动。现在发生的事情是,带有http://的链接在网络视图和浏览器中都打开了。但是,没有http://的链接显示网页不可用 在webview中处理onclick链接的代码: // to know which link is clicked

我有一个webview,webview可能包含一个带有两种不同类型链接的网页。我想要的是,如果用户单击包含
http://webpagename.com
它应该在手机浏览器中打开链接。如果用户单击第二种类型的链接,该链接没有
http://
,则应将其重定向到新活动。现在发生的事情是,带有
http://
的链接在网络视图和浏览器中都打开了。但是,没有
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://
链接始终在浏览器中打开,而其他链接打开一个活动,但在webview中没有打开任何内容?

从中,应使用
覆盖方法()

返回

如果宿主应用程序希望离开当前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(视图、url);返回真值;但都一样。帮不了我是的,我只是仔细看看你的代码。有点不稳定。您不应该在
shouldOverrideUrlLoading()
方法内设置另一个
WebViewClient
。在一个客户端中覆盖您需要的两种方法,并设置一次。我的意思是,如果它是http url,则该url会按预期在浏览器中打开,但如果它是非http链接,则会显示在webview中找不到的页面,这是对的。我没在想。由于您正在处理这两种情况,因此无论发生什么情况,该方法都应该返回
true
,因此从
if-else
中取出
return
s并将
return true在方法的末尾。它可以工作,谢谢!我已经用新代码编辑了你的答案