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

所属分类: 软件编程 / Android 阅读数: 32
收藏 0 赞 0 分享

本文实例讲述了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/index.html");

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

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

更多精彩内容其他人还在看

Android中加入名片扫描功能实例代码

这篇文章主要介绍了Android中加入名片扫描功能实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android仿微信发表说说实现拍照、多图上传功能

这篇文章主要为大家详细介绍了Android仿微信发表说说实现拍照、多图上传功能,使用Retrofit2.0技术,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

设置Android系统永不锁屏永不休眠的方法

在进行Android系统开发的时候,有些特定的情况需要设置系统永不锁屏,永不休眠。本篇文章给大家介绍Android 永不锁屏,开机不锁屏,删除设置中休眠时间选项,需要的朋友一起学习吧
收藏 0 赞 0 分享

Android Retrofit 2.0框架上传图片解决方案

这篇文章主要介绍了Android Retrofit 2.0框架上传一张与多张图片解决方案,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android自定义等待对话框

这篇文章主要为大家详细介绍了Android自定义等待对话框的实现方法,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android中Window添加View的底层原理

这篇文章主要介绍了Android中Window添加View的底层原理,需要的朋友可以参考下
收藏 0 赞 0 分享

Android调用系统默认浏览器访问的方法

这篇文章主要介绍了Android调用系统默认浏览器访问的方法的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发退出程序的方法汇总

Android程序有很多Activity,比如说主窗口A,调用了子窗口B,子窗口B又调用子窗口C,back返回子窗口B后,在B中如何关闭整个Android应用程序呢? 下面脚本之家小编就给大家介绍android开发退出程序的几种方法,感兴趣的朋友参考下吧
收藏 0 赞 0 分享

Android程序开发中单选按钮(RadioGroup)的使用详解

在android程序开发中,无论是单选按钮还是多选按钮都非常的常见,接下来通过本文给大家介绍Android程序开发中单选按钮(RadioGroup)的使用,需要的朋友参考下吧
收藏 0 赞 0 分享

Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中

这篇文章主要介绍了Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多