Android混合开发中遇到内置H5界面点击标题栏返回按键无法后退问题跟踪解决

最近在做项目开发,在Android原生代码中采用WebView呈现H5界面内容后,发现界面标题栏的返回按钮点击后无任何反应,自己也是查阅了很多的资料和内容,为了避免以后再次遇到这样的问题,特此记录。

问题描述:我们在androidAPP 中通过webView集成了一个外部的链接网址,集成后,发现Html界面上标题栏的返回按钮无法使用,点击后无任何反应。在这里贴出Html中返回按钮的代码,其他部分无影响,所以暂不贴出。

html的界面显示如图:


html中返回按钮的代码:

<a href="javascript:void(0);" class="bm-header-btn"><i class="icon-back"></i></a>

看起来是非常正常的实现方式,在浏览器中运行均可以正常返回上一层,但是集成到APP中就会出问题。


问题解决思路:

1.首先,Android和IOS系统均集成了,但是IOS系统是没有问题的,所以初步判定可能是适配性问题,毕竟移动端网页和WEB端还是有区别的;

2.考虑可能是由于网页缓存问题,所以也去研究了html中的缓存机制是否会影响后退按钮的使用,调查发现在Android的WebView中,可以设置缓存方式,主要有以下几种:

LOAD_CACHE_ONLY:  不使用网络,只读取本地缓存数据

LOAD_DEFAULT:  根据cache-control决定是否从网络上取数据。

LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式

LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.

LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。

如:如果在手机端加载的html中,缓存采用如下设置方式:

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="">
即在网页上和浏览器中均不做缓存,后退时,重新对界面进行刷新。

在模式LOAD_DEFAULT下,无论如何都会从网络上取数据,如果没有网络,就会出现错误页面;

LOAD_CACHE_ELSE_NETWORK模式下,无论是否有网络,只要本地有缓存,都使用缓存。本地没有缓存时才从网络上获取。

如果在html中设置了本地缓存,

<meta http-equiv="cache-control" content="max-age=60">

LOAD_DEFAULT,LOAD_CACHE_ELSE_NETWORK两种模式下都使用本地缓存数据。

总结:根据以上两种模式,建议缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK

在自己的webSettings对象中加入以下代码:

 ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
 android.net.NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
 if (networkInfo.isAvailable()) {
       webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
  } else {
       webSettings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
  }
解决了缓存问题后,发现还是无法实现点击返回按钮进行界面回退问题。

3.从WebViewClient对象出发,对其设置和重写方法进行分析

webView.setWebViewClient(new WebViewClient() {
     @Override
     public void onPageStarted(WebView view, String url, Bitmap favicon) {
           Log.e(TAG, "onPageStarted url = " + url);
     }

     @Override
     public void onPageFinished(WebView view, String url) {
           Log.e(TAG, "onPageFinished");
     }

     @Override
     public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
          return false;
     }

     @Override
     public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
          super.onReceivedHttpError(view, request, errorResponse);
          Log.e(TAG, "onReceivedHttpError");
     }

     @Override
     public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
          super.onReceivedError(view, request, error);
          Log.e(TAG, "onReceivedError");         
     }
});

 onPageStarted(WebView view, String url, Bitmap favicon):

该方法在网页加载时调用,该方法只在加载main frame时加载一次。在网页还未完全加载完成时,界面会处于一片空白,影响用户体验,所以在网页未加载完成时,可以显示加载动画,就可以在该函数中进行处理。

view:当前加载的WebView对象,可以通过该对象查看当前WebView的一些属性。

url:当前加载网页的地址,可以是相对地址也可以是绝对地址。

favicon:一般不做设置。

 onPageFinished(WebView view, String url):

界面加载完成时调用,一般可在该函数中进行加载动画的隐藏,否则加载动画将和界面一起显示,影响效果。

shouldOverrideUrlLoading(WebView view, String url):

这个函数会在加载超链接时回调过来;所以通过重写shouldOverrideUrlLoading,可以实现对网页中超链接的拦截; 
返回值是boolean类型,表示是否屏蔽WebView继续加载URL的默认行为,因为这个函数是WebView加载URL前回调的,所以如果我们return true,则WebView接下来就不会再加载这个URL了,所有处理都需要在WebView中操作,包含加载。如果我们return false,则系统就认为上层没有做处理,接下来还是会继续加载这个URL的。WebViewClient默认就是return false的。

在代码中对该方法进行重写后,拦截了WebView对url加载的默认行为,采用冲定向的方式进行加载,终于大功告成了。

            @Override  
            public boolean shouldOverrideUrlLoading(WebView view, String url) {  
            	 Log.i("shouldOverrideUrlLoading","URL="+url);
            	 view.loadUrl(url);  
                return true;  
            }  
        };
然后重新运行,发现返回按钮终于可以起作用啦,oh~yeah
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值