Android开发之WebView具体解释
概述:
一个显示网页的视图。这个类是你能够滚动自己的Web浏览器或在你的Activity中简单地显示一些在线内容的基础。它使用了WebKit渲染引擎来显示网页,包含向前和向后导航的方法(通过历史记录)。放大和缩小,运行文本搜索等。
须要注意的是:为了让你的应用可以使用WebView訪问互联网和载入网页。你必须加入Internet的权限在Android Manifest文件里:
<uses-permission android:name="android.permission.INTERNET" />
类结构:
java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup
↳ android.widget.AbsoluteLayout
↳ android.webkit.WebView
经常用法:
PublicMethods |
|
WebSettings |
getSettings() 获取设置WebView的WebSettings对象。 |
void |
setWebViewClient(WebViewClient client) 设置将接收各种通知和请求的WebViewClient。 |
void |
setWebChromeClient(WebChromeClient client) 设置chrome处理。 |
说明:
WebSettings
getSettings()获取设置WebView的WebSettings对象。
WebSettings经常用法:
方法 |
说明 |
setAllowFileAccess |
启用或禁用WebView訪问文件数据 |
setBlockNetworkImage |
是否显示网络图像 |
setBuiltInZoomControls |
设置是否支持缩放 |
setCacheMode |
设置缓冲的模式 |
setDefaultFontSize |
设置默认的字体大小 |
setDefaultTextEncodingName |
设置在解码时时候用的默认编码 |
setFixedFontFamily |
设置固定使用的字体 |
setJavaScriptEnabled |
设置是否支持Javascript |
setLayoutAlgorithm |
设置布局方式 |
setLightTouchEnabled |
设置用鼠标激活被选项 |
setSupportZoom |
设置是否支持变焦 |
void setWebViewClient(WebViewClient client)
设置将接收各种通知和请求的WebViewClient。
WebViewClient 经常用法:
方法 |
说明 |
doUpdateVisitedHistory |
更新历史记录 |
onFormResubmission |
应用程序又一次请求网页数据 |
onLoadResource |
载入指定地址提供的资源 |
onPageFinished |
网页载入完成 |
onPageStarted |
网页開始载入 |
onReceivedError |
报告错误信息 |
onScaleChanged |
WebView发生改变 |
shouldOverrideUrlLoading |
控制新的连接在当前WebView中打开 |
void setWebChromeClient(WebChromeClient client) 设置chrome处理。
WebChromeClient经常用法:
方法 |
说明 |
onCloseWindow |
关闭WebView |
onCreateWindow |
创建WebView |
onJsAlert |
处理Javascript中的Alert对话框 |
onJsConfirm |
处理Javascript中的Confirm对话框 |
onJsPrompt |
处理Javascript中的Prompt对话框 |
onProgressChanged |
载入进度条改变 |
onReceivedlcon |
网页图标更改 |
onReceivedTitle |
网页Title更改 |
onRequestFocus WebView |
显示焦点 |
自己定义WebView,你能够加入你自己的行为:
- 创建和设置WebChromeClient子类。
当一些可能影响浏览器的用户界面发生了,比如,进度更新和JavaScript警报送到这里(见调试任务)调用这个类。
- 创建和设置WebViewClient子类。
当影响内容呈现的事情发生是调用这个类,比如。错误或表单提交。您也能够拦截的URL载入到这里(通过shouldOverrideUrlLoading())。
- 改动WebSettings,如以setJavaScriptEnabled()方式启用JavaScript。
- 将Java对象通过addJavascriptInterface(Object,String)方法注射到WebView。 这方法同意您将Java对象注入到一个页面的JavaScript上下文,这样他们能够通过JavaScript訪问的页面。
以下是一个更加复杂的样例,显示错误处理,设置和进展通知:
// Let's display the progress in the activity title bar, like the
// browser appdoes.
getWindow().requestFeature(Window.FEATURE_PROGRESS);
webview.getSettings().setJavaScriptEnabled(true);
final Activity activity = this;
webview.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
//Activities and WebViews measure progress with different scales.
//The progress meter will automatically disappear when we reach 100%
activity.setProgress(progress * 1000);
}
});
webview.setWebViewClient(new WebViewClient() {
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
}
});
webview.loadUrl("http://developer.android.com/");
缩放:
能够通过 设置 WebSettings.setBuiltInZoomControls(boolean) ,启用内置缩放。
注意:使用缩放。假设不是高度或宽度设置为WRAP_CONTENT可能会导致不确定的行为,应该避免。
Cookie 和窗体管理:
出于显而易见的安全原因。您的应用程序都有自己的缓存。cookie存储等。它不共享浏览器应用程序的数据。
默认情况下。通过HTML请求打开新的窗体将被忽略。
这是确切的它们是被JavaScript打开还是被目标链接打开。您能够自己定义您的WebChromeClient提供自己的行为打开多个窗体。并使用你想要的不论什么方式渲染它们。
WebView中构建Web应用程序:
假设你想提供一个Web应用程序(或仅仅是一个网页)作为client应用程序的一部分,你能够使用WebView做到这一点。WebView类是Android的View类的一个扩展,它能够让你显示网页作为你的活动布局的一部分。它不包含一个全然开发的Web浏览器的不论什么功能,如导航控件或一个地址栏。
全部的WebView默认情况下是显示一个Web页面。
一个使用WebView的常见的场景:是当你想要在你的应用程序中提供可能须要更新的信息。如一个终端用户协议或用户指南,那么使用WebView是非常有帮助的。 在你的Android应用程序中你能够创建一个包括WebView的Activity然后用它来显示的在线托管的文档。
还有一个使用WebView的常见的场景:是假设你的应用程序提供的数据总是须要从Internet上获取。如电子邮件。
在这样的情况下。你可能会发现它更easy在你的Android应用程序。显示全部的用户数据的网页,而不是运行一个网络请求,然后解析数据。并渲染它在Android的布局,以建立一个WebView。相反。你能够设计的专为Android设备的网页,然后实施的WebView在你的Android应用程序载入的网页。
以下将向你展示怎样開始使用WebView,以及怎样做一些额外的事情,比方在你的Android应用程序中处理页面导航和从网页上绑定JavaScript到client的代码。
基本使用方法:
默认情况下,WebView不提供类似浏览器的窗体小部件,不启用JavaScript和网页错误被忽略。
假设你的目的仅仅是显示一些HTML作为用户界面的一部分,这或许还不错;用户将不再须要与网页进行交互阅读,而且该网页将不须要与用户进行交互。假设你须要一个全面的Web浏览器,那么你可能要调用浏览器应用程序来载入URL,而不是用WebView中显示它。
比如:
1) 在你的APP中加入一个WebView:
<? xml version="1.0" encoding="utf-8"? >
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
2) 使用loadUrl()方法载入一个web页面:
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://www.example.com");
3) 给应用程序加入訪问网络的权限:
<manifest ... >
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
以上就是显示一个最主要的web页面全部的步骤。
在WebView中使用JavaScript :
假设你计划在你的WebView载入网页时使用JavaScript,你必须为你的WebView启用JavaScript。一旦启用JavaScript,你还能够创建你的应用程序代码和JavaScript代码之间的接口。
JavaScript在WebView中默认情况下是被禁用的。
你能够通过附加在WebView上的WebSettings启用它。即使用getSettings()获取WebSettings
,然后启用使用setJavaScriptEnabled()方法启用JavaScript。
WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
JavaScript代码绑定到Android代码:
在开发一个web应用程序,专门设计的WebView在你的Android应用程序中,您能够创建您的JavaScript代码和clientAndroid代码之间的接口。比如,您的JavaScript代码能够在你的Android代码中调用一个方法来显示Dialog,而不是使用JavaScriptalert()方法。
调用addJavascriptInterface()方法绑定一个新的JavaScript和Android代码之间的接口。通过它 一个类实例绑定到你的JavaScrip,JavaScript能够调用一个接口名称訪问类。
public class WebAppInterface {
Context mContext;
/** Instantiatethe interface and set the context */
WebAppInterface(Context c) {
mContext = c;
}
/** Show a toastfrom the web page */
@JavascriptInterface
public void showToast(String toast) {
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
}
注意:假设你设置的targetSdkVersion为17或更高,则必须加入@JavascriptInterface为不论什么您想要提供给您的JavaScript(该方法必须是public)方法加入标注。假设你不提供注解,在Android4.2或更高版本号上执行时该方法是不能被网页訪问的。
在上面这个样例中,WebAppInterface 类同意网页调用showToast()方法创建一个Toast 消息。
你能够通过addJavascriptInterface()方法和Android接口名,绑定这个类到执行在你的WebView中的JavaScript上。
WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new WebAppInterface(this), "Android");
这将为执行在WebView中的JavaScript创建一个名为Android的接口。
在这一点上,Web应用程序能够訪问WebAppInterface类。比如,以下是一些HTML和JavaScript在单击button的时候将创建一个Toast消息。
<input type="button" value="Sayhello" onClick="showAndroidToast('Hello Android!')" />
<script type="text/javascript">
function showAndroidToast(toast) {
Android.showToast(toast);
}
</script>
这不须要从JavaScript接口初始化Android。 WebView自己主动的将它应用到你的web页面中。 因此,按下buttonshowAndroidToast()方法使用Android接口调用WebAppInterface.showToast()方法。
注:绑定到你的JavaScript对象执行在还有一个线程。而不是在它构建的线程。
警告:使用addJavascriptInterface()将同意 JavaScript来控制你的Android应用程序。 这是一个很实用的特性或危急的安全问题。
当WebView的HTML是不值得信任的(比如。部分或所有的HTML是由一个不知名的人或进程提供的)。那么攻击将者运行包含在HTML和选择的不论什么client代码。
因此,不应该使用addJavascriptInterface()除非你写的所有HTML和JavaScript出如今你WebView。
你应该也不同意用户导航到其它不是自己的网页,,在你的WebView内(相反,同意用户的通过默认浏览器应用程序打开外部链接。应用的web浏览器打开全部的URL链接,所以要小心你仅仅有在处理页面导航中描写叙述下面部分)。
处理页面导航:
当用户单击在WebView上的链接时,默认行为是启动一个处理URL的Android应用。通常默认网页浏览器打开和装在目的URL。可是你能够为WebView覆盖这个行为,以便在你的WebView上打开链接。然后。您能够同意用户前后浏览通过的由您的WebView保留的网页历史记录。
要打开用户点击链接,仅仅是提供一个WebViewClient为您的WebView,使用setWebViewClient()。
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new WebViewClient());
这样。
用户点击的全部的链接。都在你的WebView上载入。
假设你想很多其它的控制点击链接的载入。创建自己的WebViewClient的覆盖shouldOverrideUrlLoading()方法。
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (Uri.parse(url).getHost().equals("www.example.com")) {
// This is my web site, so do not override;let my WebView load the page
return false;
}
// Otherwise, the link is not for a page on my site, so launch anotherActivity that handles URLs
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
}
然后为WebView创建一个新的WebViewClient实例:
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new MyWebViewClient());
如今。当用户点击一个链接时。系统调用shouldOverrideUrlLoading(),它会检查URL主机是否一个特定的域相匹配(定义如上)。假设不匹配,那么为了不重写的URL载入(它同意WebView载入的URL照常)方法返回false。假设URL中的主机不匹配,那么 一个Intent将被创建启动默认的Activity 处理URL(它能够解决用户的默认Web浏览器)。
浏览网页的历史记录:
当你的WebView重载URL载入的时,WebView会自己主动累加訪问过的网页的历史记录。您能够通过goBack()和 goForward()方法向后、向前浏览。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// Check if thekey event was the Back button and if there's history
if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
myWebView.goBack();
return true;
}
// If it wasn'tthe Back key or there's no web page history, bubble up to the default
// systembehavior (probably exit the activity)
return super.onKeyDown(keyCode, event);
}
假设有一个实际的网页历史记录用户訪问的canGoBack()方法返回true。相同地。你能够使用canGoForward()来检查是否有历史前进。
假设不运行此检查,那么一旦用户到达历史的终结,GoBack()或goForward()什么也不做。
应用实例:
Android开发之WebView具体解释的更多相关文章
- Android开发之SpannableString具体解释
在实际的应用开发过程中常常会遇到.在文本的不同部分显示一些不同的字体风格的信息如:文本的字体.大小.颜色.样式.以及超级链接等. 普通情况下,TextView中的文本都是一个样式.对于类似的情况.能够 ...
- Android开发之WebView的开发使用(源码分享)
假设我们想提供一个web应用程序(或仅仅是一个网页)作为client应用程序的一部分,我们能够使用WebView.WebView类是Android的视图类的扩展,它同意您显示web页面的一部分活动布局 ...
- Android开发之AlarmManager具体解释
AlarmManager实质是一个全局的定时器,是Android中经常使用的一种系统级别的提示服务,在指定时间或周期性启动其他组件(包含Activity,Service,BroadcastReceiv ...
- Android开发之TextView高级应用
Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大家分享一下TextView的一些使用技巧. A ...
- Android混合开发之WebView与Javascript交互
前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...
- Android混合开发之WebView使用总结
前言: 今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结. 混合开发相关博客: Android混合开发之WebView使用总结 Android混合开 ...
- Android安全开发之WebView中的地雷
Android安全开发之WebView中的地雷 0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者 ...
- android软件开发之webView.addJavascriptInterface循环渐进【二】
本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gra ...
- android软件开发之webView.addJavascriptInterface循环渐进【一】
本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gra ...
随机推荐
- Linux中Source的用法
source命令:source命令的功能:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录.用法 ...
- hihoCoder [Offer收割]编程练习赛83 D 生成树问题
题目 从 Kruskal 算法的角度来思考这个问题. 考虑 $n$ 个点的"空图"(即没有边的图). 先将 $m_2$ 条无权值的边加到图中,得到一个森林. 按边权从小到大的顺序枚 ...
- hdu 3721 树的直径
思路:枚举+树的直径 #include<iostream> #include<cstring> #include<cstdio> #include<algor ...
- 安装淘宝内核LVS
具体安装方法按照淘宝twiki来:http://kernel.taobao.org/index.php?title=Documents/Kernel_build. 但是有些问题是要注意的: 1. 修改 ...
- Codeforces Round #315 (Div. 2) B 水题强行set
B. Inventory time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- bzoj 合集 1079 1791 1876 2208 2306
1079 记忆化瞎搞吧,[a][b][c][d][e][l]表示当前有能涂1次的油漆a个,能涂2次的b个….前一个颜色为l,再搞下转移就行了. 1791 基环树上找直径 1876 高精度 2208 看 ...
- react自定义组件属性类型检测
react当中的props-type用来检测传入组件当中的数据是否符合组件的要求,但是之前的只是能做些简单常规的判断,如果需要做复杂的判断,就需要使用到自定义函数来做类型检测了. 下面是官网的例子 c ...
- 2018华南理工大学程序设计竞赛 H-对称与反对称
H-对称与反对称 题目描述 给出一个N*N的方阵A.构造方阵B,C: 使得A = B + C.其中 B为对称矩阵,C为反对称矩阵. 对于方阵S中的任意元素,若(S)ij = (S)ji,则称S为对称矩 ...
- FTK应用程序编程接口(API)手册-1【转】
转自:http://blog.csdn.net/absurd/article/details/6702047 框架函数 框架函数支撑FTK的主体,它负责初始化应用程序,启动主循环和退出主循环.它对任何 ...
- bq25890 ship mode
Precondition 此是以 evb board 來做實驗的. 沒接 Vbus 僅接 i2c ,仍可以 讀寫 i2c register,但是 adc 似乎不能 working, evb board ...