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
相关产品推荐
相关产品推荐

