Android开发中使用WebView控件浏览网页的方法详解
本文实例讲述了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程序设计有所帮助。
- python并发编程之多进程理论部分
- 使用concurrent.futures模块并发,实现进程池、线程池
- 人工智能与医疗
- 每周论文清单:知识图谱,文本匹配,图像翻译,视频对象分割
- 进程池、线程池、回调函数
- java学习:weblogic下JNDI及JDBC连接测试(weblogic环境)
- 简单谈谈python的反射机制
- java学习:使用dom4j读写xml文件
- python文件和目录操作方法大全
- 自动驾驶汽车伦理大讨论:到底谁有权决定他人的生死?
- 异常处理:1215 - Cannot add foreign key constraint
- pymysql模块
- oracle 11g 查看服务端/客户端编码,及修改db编码
- PHP7 下的协程实现
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 多图详解Spring框架的设计理念与设计模式
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.2-3.5):标识符、关键字、注释、变量及常量
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.1):一个简单的例子
- 详解Java解析XML的四种方法
- 《Java从入门到失业》第四章:类和对象(4.6):类路径
- 《Java从入门到失业》第四章:类和对象(4.5):包
- 《Java从入门到失业》第四章:类和对象(4.4):方法参数及传递
- 《Java从入门到失业》第四章:类和对象(4.3):一个完整的例子带你深入类和对象
- 《Java从入门到失业》第四章:类和对象(4.2):String类
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.9):数组(数组基本使用、数组的循环、数组拷贝、数组排序、多维数组)
- Establishing SSL connection without server identity verification is not recommended
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.8):流程控制(循环语句、while语句、for语句)
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.8):流程控制(选择语句、if-else语句、switch语句)
- 线上服务启动卡死,堆栈分析
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.7):运算符(自增自减、关系运算、逻辑运算、条件运算、位运算、赋值运算、类型转换)