android webview goBack不起作用的解决方法

本文详细介绍了在程序中遇到的Webview表单提交后,调用goBack()方法不起作用的问题,并提供了解决方案。通过重载onFormResubmission方法,确保在表单提交后的返回操作得以正常执行。

有的时候,在程序中的webview在调用goBack()方法时,不起作用。这时候可能是这个web页面是一个表单提交的结果页,这时需要重载onFormResubmission

@override   
public void onFormResubmission(WebView view, Message dontResend, Message resend)   
{   
    resend.sendToTarget();  
 } 

转自:http://blog.youkuaiyun.com/andyddd/article/details/7275994

<think>嗯,用户的问题是关于Android WebView在加载链接失败后无法使用goBack回退的问题。我需要仔细分析这个情况,找出可能的原因和解决方案。 首先,用户提到加载失败的链接导致无法goBack,这可能是因为WebView的历史记录没有正确更新。当页面加载失败时,WebView可能没有将失败的URL添加到历史记录中,导致goBack()方法没有可返回的页面。我需要检查WebView的历史记录处理机制。 接下来,我应该考虑重写WebViewClient的相关方法,比如onPageStarted和onPageFinished,或者处理onReceivedError。可能需要在加载失败时手动管理一个历史记录栈。例如,当加载失败时,即使页面没有成功加载,仍然将URL添加到自定义的堆栈中,这样goBack时可以正确返回。 另外,用户可能需要覆盖shouldOverrideUrlLoading方法,以确保所有页面跳转都经过自定义处理,从而正确维护历史记录。同时,处理onReceivedError和onReceivedHttpError等方法,在这些情况下记录失败状态,并在回退时进行相应处理。 还需要注意WebViewgoBack()方法本身的行为,它可能只在有历史记录时有效,因此需要检查canGoBack()的状态,并据此决定是否执行goBack()或者关闭Activity/Fragment。 另外,参考用户提供的引用中提到了WebView全屏后导致父FragmentActivity重新加载的问题,这可能涉及到配置变化导致WebView状态丢失。虽然用户当前的问题同,但需要考虑配置变化对WebView历史记录的影响,例如在AndroidManifest中设置configChanges属性,或者在代码中保存和恢复WebView的状态。 综合这些思路,解决方案可能包括自定义历史堆栈管理、重写WebViewClient的方法、处理加载错误的情况,以及确保WebView的状态在配置变化时得到保存。需要分步骤指导用户实现这些方法,并提供代码示例。</think>### Android WebView返回失效解决方案 当WebView加载失败链接导致goBack失效时,核心问题在于历史记录栈未正确维护。以下是分步解决方案: 一、**自定义历史栈管理** 1. 创建LinkedList存储有效历史记录 ```java private LinkedList<String> historyStack = new LinkedList<>(); ``` 二、**重写WebViewClient方法** ```java webView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { if (!historyStack.isEmpty() && !url.equals(historyStack.peekLast())) { historyStack.add(url); } } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // 错误处理时仍保留历史记录 if (!historyStack.contains(failingUrl)) { historyStack.add(failingUrl); } } }); ``` 三、**改造返回键逻辑** ```java @Override public void onBackPressed() { if (webView.canGoBack() && historyStack.size() > 1) { historyStack.removeLast(); // 移除当前失败页面 String prevUrl = historyStack.removeLast(); webView.loadUrl(prevUrl); } else { super.onBackPressed(); } } ``` 四、**增强错误处理(API 23+)** ```java @Override public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { String url = request.getUrl().toString(); handleFailedUrl(url); // 自定义错误处理方法 } } ``` **关键配置建议**: 1. 在AndroidManifest.xml中为WebView Activity添加: ```xml android:configChanges="orientation|screenSize|keyboardHidden" ``` 防止旋转屏幕导致WebView重置[^1] 2. 添加网络状态检查: ```java private boolean isNetworkAvailable() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值