解决WebView 因重定向无法正常goBack()的问题

解决WebView 因重定向无法正常goBack()的问题

首先说下问题,初始页面为A,点击某个链接跳转到B(http://xxx.com.cn/),B页面重定向到C页面(http://xxx.com.cn/website/index.html)

当调用webview.goBack()时,页面回退到B,然后接着会重定向回C页面.

这样会导致两个问题:

1. 无法回退到webview的初始页面A

2. 无法正常退出Activity或者Fragment(只有还未加载完C时进行回退才能退出页面)

关于如何解决这个问题其实也可以从两个方面去解决:

1. 首先需要和前端开发人员沟通,看重定向是否必要,如果跳转链接只是域名,然后默认重定向到  域名/index.html,并没有特殊处理的话,那么这种重定向并没有意义.

只要将网页中的连接,比如

<a href="http://xxx.com.cn"/>

直接替换为

http:///xxx.com.cn/index.html

即可解决该问题.

2.页面中的重定向是必须的,那么我们就需要自己维护一个webview的历史栈,根据自己的需求进行过滤跳转或者重新加载页面:

判断到当前为重定向后的链接,那么那么当webview.goback()的时候就需要忽略上一级的链接,获取到初始页面链接后自己进行load:

比如定义一个历史栈 :

private ArrayList<String> loadHistoryUrls = new ArrayList<String>();

首先把初始页面Url加入

loadHistoryUrls.add(INITAL_WEB_URL);

然后加入加载的url:

 public boolean shouldOverrideUrlLoading(WebView view,String url){

         //将过滤到的url加入历史栈中
           loadHistoryUrls.add(url);
           return true;          

        }

最后在webview.goback()处理:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //判断是否可以返回操作
        if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
           //过滤是否为重定向后的链接
           if(loadHistoryUrls.size()>0&&loadUrls.get(loadHistoryUrls.size()-1).contains("index.html"))

             //移除加载栈中的最后两个链接
             loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size()-1));

             loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size()-1));

             //加载重定向之前的页
             loadHistoryUrls.load(loadUrls.get(loadHistoryUrls.size()-1));

            } 

        }        return super.onKeyDown(keyCode, event);    }

关于加载栈,后来发现webview本身也有对应的API:

           //获取历史列表
            WebBackForwardList mWebBackForwardList = webView.copyBackForwardList();

不过这个api可能受系统版本的影响或者不同手机系统进行了修改

所以解决该问题时,大家可以自己根据需求,自己维护加载的历史栈或者直接调用系统api.

时间: 2024-10-12 08:37:13

解决WebView 因重定向无法正常goBack()的问题的相关文章

Android解决WebView的定位功能、视频全屏播放、下载功能、页面Url的处理、进度条处理

解决WebView的定位功能.视频全屏播放.下载功能.页面Url的处理.进度条处理 事先说明: 定位功能在安卓6.0需要用户手动确认权限后才能使用 若需在安卓6.0适配WebView的定位功能,则需要在WebView中手动增加用户权限访问 详细可百度安卓6.0权限管理系统,或者采用第三方封装好的权限管理类进行编写(如Bmob) 如果对内容不理解的话,可参考最后的整个类的代码 如果对BaseActivity这个抽象类不理解的话,可以查看下面一篇文章对BaseActivity的介绍 步骤一:webv

解决webview.getFavicon()返回值总是为空的问题

在webview中,我们需要获取网站的favicon.ico图标,但是默认状态下,WebChromeClient中的onReceivedIcon方法获取到的icon总是为null; webview.getFavicon();获得到的还是null,这个就奇怪了,于是 经过一番google,发现老外也遇到了这个问题. ======================================================= http://stackoverflow.com/questions/3

WebView加载完网页之后利用js进行网页刷新,解决webview显示图片适应所有的机型

android: /** * 自动以的webviewclient * @author jwguo * */ private class MyWebViewClient extends WebViewClient { @Override public void onPageFinished(WebView view, String url) { // TODO Auto-generated method stub view.loadUrl("javascript:var imgs = docume

解决WebView加载URL跳转到系统浏览器的问题

1.问题 webview加载url跳转到系统浏览器,用户体验非常的差 2.解决方法 重写WebViewClient的shouldOverrideUrlLoading(WebView view, String url)使用view.loadUrl(url);加载url WebView webView= (WebView) findViewById(R.id.webView); webView.getSettings().setJavaScriptEnabled(true); webView.loa

UX2内核浏览加速技术纲要[带你解决WebView卡顿]

UX2内核是本人负责主要开发的浏览服务项目,其主要目的是为开发者提供一个简单好用.轻便的网络浏览服务.UX2内核的安卓端是基于WebView进行深度优化的,同时欢迎大家使用这个内核用于app页面或浏览器,UX2正式版将于2017年6月发布,详情请关注我们,联系方式在文章下面.   1.缓存加速  UX2内核通过判断网络类型.网络速度.设备情况来分配使用缓存,UX2内核不仅仅是直接设置WebSettings的缓存设置,还重写了WebView缓存管理的部分功能,能够比WebView更好的使用缓存.

Android 解决WebView和ScrollView滚轮滑动冲突

第一步,重写WebView的onGenericMotionEvent方法 /** * 滑轮处理 */ @Override public boolean onGenericMotionEvent(MotionEvent event) { if (callback != null) return callback.onGenericMotionEvent(event); return super.onGenericMotionEvent(event); } //定义一个接口,把滚动事件传递出去 pu

android解决webview,页面关闭之后,视频或者音频还在播放的问题

方法1: 调用 webView.loadUrl("about:blank"); 这个方法会 销毁所有的video和audio 包括js的所有正在运行的function 方法2: @Override public void onPause() { super.onPause(); myWebView.onPause(); myWebView.pauseTimers(); } @Override public void onResume() { super.onResume(); myWe

Android WebView 常见问题锦集!

收集了一些资料,集中整理一下,以备不时之需,顺便也分享一下,如果觉得好的,麻烦点个赞,觉得没什么意义的可以直接飘过,嘎嘎~~~~ Android 解析比较详细的文章 http://blog.csdn.net/t12x3456/article/list/2 1.Android的WebView控件载入网页显示速度慢的究极解决方案 http://www.cnblogs.com/xinye/p/3144139.html 2.WebView中的Java与JavaScript提供[安全可靠]的多样互通方案

Android WebView中那些不得不解决的坑~~

前面那张hybrid开发心得 有人问 怎么解决不用onJsPrompt 来回调js函数的问题.其实很简单,就是在在你的jscalljava回调函数内 另外开个线程去load js代码即可: 1 wb.post(new Runnable() { 2 @Override 3 public void run() { 4 wb.loadUrl("javascript:display_alert()"); 5 } 6 }); 好,然后开始说一下webview.webview其实我一直都很痛恨这个