You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:39:57