从WebView返回Activity时Android应用崩溃问题求助
问题解决:WebView Activity返回时崩溃
问题描述
开发了一个包含两个Activity的简单应用,通过Intent从Menu Activity跳转到WebView时运行正常,但点击返回按钮回到原Activity时应用崩溃,提示“关闭应用”。代码无语法错误且Logcat未显示任何错误。
原代码如下:
public class WebView extends AppCompatActivity { WebView webView; @SuppressLint("SetJavaScriptEnabled") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view); String url = getIntent().getStringExtra("site_url"); android.webkit.WebView webView = findViewById(R.id.webView); webView.setWebViewClient(new WebViewClient()); webView.getSettings().setSupportZoom(true); webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl("" + url); } private class MywebClient extends WebViewClient { @Override public void onPageStarted(android.webkit.WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); } @Override public boolean shouldOverrideUrlLoading(android.webkit.WebView view, WebResourceRequest request) { return super.shouldOverrideUrlLoading(view, request); } } @Override public void onBackPressed() { android.webkit.WebView webView = null; if(webView.isFocused() && webView.canGoBack()) { webView.goBack(); }else{ super.onBackPressed(); } } }
问题分析
崩溃的核心原因是onBackPressed()方法中的错误:
- 方法内重新声明了局部变量
android.webkit.WebView webView = null;,直接调用webView.isFocused()会触发空指针异常,这是返回时崩溃的根本原因。 onCreate()方法中同样重新定义了局部的webView,导致类成员变量的webView始终为null,无法被后续方法正确调用。
解决方案
修正步骤:
- 移除
onCreate()中webView的局部声明,直接给类成员变量赋值 - 移除
onBackPressed()中重新定义的null值webView,使用类成员变量进行判断 - 可选:使用自定义的
MywebClient替代默认的WebViewClient,让代码逻辑更统一
修正后的完整代码
public class WebView extends AppCompatActivity { // 类成员变量 android.webkit.WebView webView; @SuppressLint("SetJavaScriptEnabled") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view); String url = getIntent().getStringExtra("site_url"); // 直接给类成员变量赋值,不再声明局部变量 webView = findViewById(R.id.webView); // 使用自定义的MywebClient webView.setWebViewClient(new MywebClient()); webView.getSettings().setSupportZoom(true); webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl(url); } private class MywebClient extends WebViewClient { @Override public void onPageStarted(android.webkit.WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); } @Override public boolean shouldOverrideUrlLoading(android.webkit.WebView view, WebResourceRequest request) { return super.shouldOverrideUrlLoading(view, request); } } @Override public void onBackPressed() { // 使用类成员变量的webView,增加非空判断避免空指针 if (webView != null && webView.isFocused() && webView.canGoBack()) { webView.goBack(); } else { super.onBackPressed(); } } }
内容的提问来源于stack exchange,提问作者easyaccess
相关产品推荐
相关产品推荐

