安卓使用webView加载网页,遇坑总结:
1 、 先说点大家都知道的,要使用webView加载网页,让网页在自己的webView中显示,而不是打开其他浏览器的话,就要设置webView的setWebClient,直接new 对象就可以了,完全可以在自己的webView中打开了,不过大部分网页都会支持js,所以一般还要设置webView,像下面的代码就可以在自己的webView中打开网页,
PS:我看到过很多人乱说各种各样的情况的,有说在shouldOverrideUrlLoading 方法中返回true的,我也是无语,所以说这点来让大家不要被迷惑,相信你自己测试下就知道了。
2、百度下webView闪的情况,肯定是一大把,因为我看到的闪可能跟别人的不一样吧!反正我百度到的闪的问题没有一个能解决我的问题的,大部分说是硬件加速搞得,但我也没遇到过,我的webView闪的时候都能看到css代码,看图就知道了
第一张是闪的情况,第二张是真正显示的样子,这就是我说的webView闪的情况,肯定不是因为硬件加速造成的,后面经过我不懈努力测试,终于知道了尼玛webView还是尽量少设置Visibility == Gone 的情况,因为你假如说先设置webView的visibility == GONE的话,等网页加载完成再显示就会出现我的这种情况,这可能是安卓的问题。
3、这是最大的坑了。 因为工作需要把别人的网页放在webView里面显示,然后可能别人的网页有些地方是你想要的,那就需要来隐藏网页(别人写的)里面的内容了,说到这里,你肯定想到了两种方法来解决这个问题,PS:不能说不解决吧,需求奇葩没办法。
第一,通过安卓来调用js来隐藏网页的某个标签或者控件
第二,直接通过HTTP请求获取网页的具体内容,然后再来替换或者删掉不需要的内容
现在,我们来一一说下这两种办法的缺点,以及真正解决问题。
先说第二种最大的问题就是通过HTTP请求来获取网页内容修改之后,又要重新调用webView的loadData方法来加载网页,问题是网页的cookie怎么办?登录,注册一些操作都不能做了,反正我是不知道怎么互相设置cookie的,会的大神教教我。
最后,我肯定就是用第一种办法解决的了。首先安卓调用js,肯定都会的,直接在onPageFinished里面调用view.loadUrl("javascript:"+你的js代码);,没错就是这样执行的,但你会看到你的网页显示出来之后,突然闪一下隐藏了你不要的控件,这样严重影响用户体验,所以只能想尽一切办法来解决这个问题了。
这种情况只能说用一个遮盖层挡住webView,等js执行完之后再去掉遮盖就可以了。注意:这里是用遮盖层挡住webView 不是设置webView的visibility == GONE,不然又回到了我第二个坑了。
然后看我下面的代码:
if(view.getProgress() >= 100 && displayed==false){
Log.i("KK", "progress ="+ view.getProgress());
view.loadUrl("javascript:var ary = document.getElementsByClassName(\"header\");var i; for(i = 0; i < ary.length;i++) {ary[i].style.display = \"none\";};");
new Thread(){
public void run() {
Log.i("KK", "隐藏加载");
try {
displayed=true;
Thread.sleep(500);
hideLoading();
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("KK", "隐藏加载完成");
};}.start();
Log.i("KK", "progress隐藏加载完成");
}
这段代码是在onPageFinished里面执行的,解释下:因为你不知道webView什么时候执行完js,所以你也不知道该在什么时候隐藏遮盖层,所以我的方法是在webView执行js的时候,另起一个线程等待500毫秒然后通知主线程隐藏遮盖,根据测试线程等待500毫秒到1秒之间的话最合适,这个时间刚好js执行完,这样是最完美的,
最后是用hideLoading()方法通知主线程隐藏遮盖
public void hideLoading(){
runOnUiThread(new Runnable() {
@Override
public void run() {
rlLoading.setVisibility(View.GONE);
displayed = false;
}
});
}
OK,webView中遇到的坑就说完了,有什么问题欢迎交流,欢迎指点提问!PS:很多常见的问题我就不在这里说了,大家不要以为没有哦!