android webview goBack()之后 getUrl()无效问题

本文探讨了在使用WebView时,如何有效判断用户是否返回到了特定URL(例如“http://www.baidu.com”)。通过介绍两种方法——利用canGoBack() API及通过URL的title进行判断,解决了在点击WebView中某些链接时显示或隐藏应用内控件的问题。



今天遇到 的问题

在点击WebView中某个连接的时候如(“http://www.baidu.com”),显示原App上的一些控件,如果不是这个连接 则隐藏这个控件

现在在setWebViewClient的 shouldOverrideUrlLoading 监听到(“http://www.baidu.com”)要跳转到链接发生变化可以做到隐藏某个控件,但是如果从某个页面返回来(“http://www.baidu.com”)这边链接时,我要进行判断当前跳转回来的url是不是www.baidu.com这个url,如果是则显示这个控件,如果不是则继续隐藏这个控件,但是getUrl的时候,获取到的url是执行完shouldOverrideUrlLoading 后的url  。也就是不管如何执行goBack()  都无法获取回退回来的页面的url。百度谷歌了一顿,没有什么好的解决方案。

然后根本我应用场景想到了两个解决方案:

1、因为我要判断的是goBack()是不是回退到了最原始的url ,如果是最原始Url显示App分享按钮,反之亦然。想到webView()有一个canGoBack()来判断是否还可以回退,此api如果回退到首页则返回false。利用此api  我在执行完goBack()后再来判断一下canGoBack()  如果返回false则说明已经到首页 ,则显示App分享按钮。

2、利用要加载的url的title来判断(需要服务器做html的配合,来确定一个唯一的title,每次url变化会执行.setWebChromeClient的onReceivedTitle把title传回来,我们判断是否是首页的title即可)


<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(); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值