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

Android WebView中@Override报错:未覆写父类方法的解决求助

解决WebView中onCreateWindow@Override错误并实现target="_blank"链接外部打开

错误原因

onCreateWindow是WebChromeClient类的方法,而非WebViewClient的方法。你把这个方法放在继承WebViewClient的myWebViewClient类中,父类没有这个方法,所以@Override注解会提示“method does not override or implement a method from a supertype”错误。

解决方案步骤

  • 将onCreateWindow方法移至自定义WebChromeClient中
  • 启用自定义的WebViewClient和WebChromeClient
  • 修复过时方法(可选但推荐)

修正后的完整代码

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Bundle;
import android.os.Message;
import android.view.KeyEvent;
import android.webkit.SslErrorHandler;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceError;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.WebChromeClient;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    WebView webView;

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = findViewById(R.id.web);

        // WebView基础设置
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setSupportZoom(false);
        webView.getSettings().setDomStorageEnabled(true);
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webView.getSettings().setSupportMultipleWindows(true);
        webView.getSettings().setUseWideViewPort(false);

        // 设置自定义WebViewClient
        webView.setWebViewClient(new MyWebViewClient());
        // 设置自定义WebChromeClient来处理新窗口请求
        webView.setWebChromeClient(new MyWebChromeClient());

        webView.loadUrl("file:///android_asset/app.html");
    }

    // 自定义WebViewClient
    public class MyWebViewClient extends WebViewClient{
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            // 适配新API,处理普通链接
            view.loadUrl(request.getUrl().toString());
            return true;
        }

        // 替换过时的onReceivedError方法
        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            webView.loadUrl("file:///android_asset/error.html");
        }

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            // 这里如果需要忽略SSL错误可以用handler.proceed(),否则保持cancel()
            handler.cancel();
        }
    }

    // 自定义WebChromeClient处理新窗口请求
    public class MyWebChromeClient extends WebChromeClient {
        @Override
        public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg) {
            WebView.HitTestResult result = view.getHitTestResult();
            String targetUrl = result.getExtra();
            if (targetUrl != null) {
                // 启动外部浏览器打开链接
                Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(targetUrl));
                view.getContext().startActivity(browserIntent);
            }
            return false; // 返回false表示不创建新的WebView窗口
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

关键说明

  • WebChromeClient的作用:负责处理WebView的窗口相关事件,比如新窗口创建、进度条、JavaScript对话框等,onCreateWindow就是用来拦截target="_blank"的新窗口请求。
  • 启用自定义客户端:必须将WebView的WebViewClient和WebChromeClient设置为你自定义的类,否则代码不会生效(你之前的代码没有使用自定义的myWebViewClient,而是新建了空的WebViewClient)。
  • 兼容性处理:替换了过时的shouldOverrideUrlLoading和onReceivedError方法,适配更高版本的Android API。

内容的提问来源于stack exchange,提问作者Ibitoyei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:30:58