WebView点击链接跳转Activity时shouldOverrideUrlLoading未调用问题求助
解决WebView中shouldOverrideUrlLoading未被调用的问题
你遇到的核心问题大概率是只重写了过时的shouldOverrideUrlLoading方法版本,导致在Android 7.0(API 24)及以上系统中,该回调无法被触发。下面是具体的解决方案和排查要点:
1. 同时重写两个版本的shouldOverrideUrlLoading方法
Android在API 24时新增了带WebResourceRequest参数的shouldOverrideUrlLoading重载方法,旧版本方法被标记为过时。为了兼容所有系统版本,你需要同时实现这两个方法:
String url = "https://try.discourse.org/"; webView = (WebView) findViewById(R.id.webView); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webView.setWebViewClient(new WebViewClient() { // 兼容API < 24的旧版本方法 @SuppressWarnings("deprecation") @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { navigateToActivityB(url); return true; // 返回true表示由App处理跳转,不交给WebView加载 } // 兼容API >= 24的新版本方法 @TargetApi(Build.VERSION_CODES.N) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String targetUrl = request.getUrl().toString(); navigateToActivityB(targetUrl); return true; } // 统一处理跳转逻辑的工具方法 private void navigateToActivityB(String targetUrl) { // 携带目标URL跳转到Activity B Intent intent = new Intent(ActivityA.this, ActivityB.class); intent.putExtra("TARGET_URL", targetUrl); startActivity(intent); } }); webView.loadUrl(url);
2. 排查其他可能的原因
如果修改后仍未触发回调,检查以下几点:
- 不要混淆
WebViewClient和WebChromeClient:确保你设置的是setWebViewClient(),而非setWebChromeClient()——后者主要处理弹窗、进度条等UI交互,不负责URL拦截。 - 处理
target="_blank"的链接:如果网页链接带有target="_blank",需要额外开启多窗口支持并重写onCreateWindow方法,否则WebView会默认忽略该跳转,也不会触发shouldOverrideUrlLoading:webSettings.setSupportMultipleWindows(true); @Override public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { WebView newWebView = new WebView(ActivityA.this); newWebView.setWebViewClient(this); WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj; transport.setWebView(newWebView); resultMsg.sendToTarget(); return true; } - 检查网页是否强制跳转系统浏览器:部分网页会通过JS代码强制调用系统浏览器打开链接,这种情况下你需要在
onPageStarted中拦截URL,或通过WebViewClient的shouldInterceptRequest方法做额外处理。
内容的提问来源于stack exchange,提问作者top secret
相关产品推荐
相关产品推荐

