当前位置: 移动技术网 > 移动技术>移动开发>Android > Android开发中使用WebView控件浏览网页的方法详解

Android开发中使用WebView控件浏览网页的方法详解

2019年07月24日  | 移动技术网移动技术  | 我要评论

本文实例讲述了android开发中使用webview控件浏览网页的方法。分享给大家供大家参考,具体如下:

项目中遇到数学展示问题,常规的textview显示处理不了数学公式,利用图片生成对服务器又产生较大压力,经过查询,可以通过webview加载js实现。ios同样的方法也可实现,但js渲染效率远高于安卓。对webview做下总结。

1.webview

在使用webview控件时,首先需要在xml布局文件中定义一个webview控件,定义的方法如下:

<webview
  android:id="@+id/webview"
  android:layout_width="match_parent"
  android:layout_height="match_parent"  />

webview中提供了很多方法,例如,我们可以使用cangoback()方法判断是否能够从该网页返回上一个打开的网页;使用gettitle()geturl()方法获得当前网页的标题和url路径;使用loadurl(string url)方法加载所要打开的网页等等。如下的代码通过使用loadurl()方法在webview控件中打开了百度主页。

2.websettings

websettings用来设置webview的属性和状态。websettings和webview存在于同一个生命周期中,可以使用如下的方法获得websettings对象。

websettings websettings = mwebview.getsettings();

在创建webview时,系统会对webview进行一些默认设置,当我们通过以上的方法得到websettings对象后,便可以从websettings对象中取出webview的默认属性和状态了,当然了,我们也可以通过websettings对象对webview的默认属性和状态进行设置。

websettings提供的一些常用的设置webview的属性和状态的方法如下:

(1)setallowfileaccess(boolean allow); //设置启用或禁止访问文件数据
(2)setbuiltinzoomcontrols(boolean enabled); //设置是否支持缩放
(3)setdefaultfontsize(int size);    //设置默认的字体大小
(4)setjavascriptenabled(boolean flag);  //设置是否支持javascript
(5)setsupportzoom(boolean support); //设置是否支持变焦

3.webviewclient

webviewclient主要用来辅助webview处理各种通知、请求等事件。我们可以通过webview的setwebviewclient()方法,为webview对象指定一个webviewclient,具体的实现方法如下所示:

mywebviewclient mywebviewclient = new mywebviewclient();
mwebview.setwebviewclient(mywebviewclient);
private class mywebviewclient extends webviewclient {
    //重写父类方法,让新打开的网页在当前的webview中显示
    public boolean shouldoverrideurlloading(webview view, string url) {
      view.loadurl(url);
      return true;
    }
}

可以看到,在如上的代码中,我们通过在子类mywebviewclient中重写父类webviewclient的shouldoverrideurlloading()方法,实现了让新打开的网页在当前的webview中进行显示,而不是调用android系统自带的浏览器进行访问。

在webviewclient中同样提供了很多的方法,比如以下一些:

(1)doupdatevisitedhistory(webview view, string url, boolean isreload);   //更新历史记录
(2)onformresubmission(webview view, message dontresend, message resend);  //重新请求网页数据
(3)onloadresource(webview view, string url); //加载指定网址提供的资源
(4)onpagefinished(webview view, string url);  //网页加载完毕
我们所做的js渲染就是在 onpagefinish 之后进行的,js 越复杂,渲染越慢。
(5)onpagestarted(webview view, string url, bitmap favicon);//网页开始加载
(6)onreceivederror(webview view, int errorcode, string description, string failingurl);//报告错误信息

主要是在网页加载失败后去调用显示。

4.webchromeclient

webchromeclient主要用来辅助webview处理javascript的对话框、网站图标、网站标题以及网页加载进度等。

同样地,我们可以通过webview的setwebchromeclient()方法,为webview对象指定一个webchromeclient。

在webchromeclient中,当网页的加载进度发生变化时,onprogresschanged(webview view, int newprogress)方法会被调用;当网页的图标发生改变时,onreceivedicon(webview view, bitmap icon)方法会被调用;当网页的标题发生改变时,onreceivedtitle(webview view, string title)方法会被调用。利用这些方法,我们便可以很容易的获得网页的加载进度、网页的标题和图标等信息了,正如下面的代码所示:

mywebchromeclient mywebchromeclient = new mywebchromeclient();
mwebview.setwebchromeclient(mywebchromeclient);
private class mywebchromeclient extends webchromeclient {
    //获得网页的加载进度,显示在右上角的textview控件中
    public void onprogresschanged(webview view, int newprogress) {
      if(newprogress < 100) {
        string progress = newprogress + "%";
        mtextview_progress.settext(progress);
      } else {
        mtextview_progress.settext(" ");
      }
    }
    //获得网页的标题,作为应用程序的标题进行显示
    public void onreceivedtitle(webview view, string title) {
      mainactivity.this.settitle(title);
    }
}

5.webview与javascript

在webview中不仅可以运行html代码,更重要的是,webview可以与javascript互相调用。也就是说,在javascript中可以获取webview的内容,与此同时,在webview中也可以调用javascript里面的方法。

下面就来说说如何在webview中调用javascript里面的方法。

这里,我使用了百度地图的api接口(一份内嵌了javascript的html文档),在该接口中提供如下的javascript方法:

/*********************************/
/*      查找地点      */
/*********************************/
var city = new bmap.localsearch(map,{renderoptions:{map:map,autoviewport:true}});
function findplace(place)
{
    city.search(place);
}

我们要做的就是在webview中调用findplace()方法,完成地点的查找。在webview中调用javascript里面的方法是通过代码webview.loadurl("javascript:方法名()")来实现的。如下的代码,从edittext控件中获得用户想要查找的地名,然后调用了javascript中的findplace()方法,进行查找。

public void onclick(view view) {
    switch(view.getid()) {
    case r.id.imagebutton_search: //查找地名
      string str = medittext_input.gettext().tostring();
      string url = "javascript:findplace('" + str + "')";
      mwebview.loadurl(url);
      break;
    }
}

6  webview 加载js 的加速

public void optimizawebview() {
    if (webview != null) {
      if (build.version.sdk_int >= 19) {
        webview.getsettings().setloadsimagesautomatically(true);
      } else {
        webview.getsettings().setloadsimagesautomatically(false);
      }
      if (build.version.sdk_int >= build.version_codes.honeycomb) {
        webview.setlayertype(view.layer_type_software, null);
      }
      webview.getsettings().setrenderpriority(websettings.renderpriority.high);
      webview.getsettings().setblocknetworkimage(true);
      webview.getsettings().setcachemode(websettings.load_cache_else_network);
      webview.getsettings().setdatabaseenabled(true);
      webview.getsettings().setappcacheenabled(true);
      webview.getsettings().setappcachepath("/data/data/com.kuailexue.student/cache");
      webview.getsettings().setappcachemaxsize(5 * 1024 * 1024);
      webview.sethorizontalscrollbarenabled(true);
      webview.getsettings().setjavascriptenabled(true);
      webview.setwebchromeclient(new webchromeclient());
      webview.getsettings().setdomstorageenabled(true);
    }
}

加载string

webview.loaddatawithbaseurl(null, buffer.tostring(), text/html, utf-8, null);

webview 加载图片

<img src="imgurl"/>

加载 assets 下的html

webview.loadurl("file:///android_asset/");

更多关于android相关内容感兴趣的读者可查看本站专题:《android视图view技巧总结》、《android编程之activity操作技巧总结》、《android布局layout技巧总结》、《android开发入门与进阶教程》、《android资源操作技巧汇总》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网