安卓21开发文档翻译:网页视图,WebView
继承
AbsoluteLayout
实现
ViewTreeObserver.OnGlobalFocusChangeListener
、
ViewGroup.OnHierarchyChangeListener
一个显示网页的视图(View)。这个类,是用来开发妳自己的网页浏览器或者在妳的活动(Activity)中简单地显示一些在线内容的基础。它使用WebKit渲染引擎来显示网页,并且包含一些方法,可用于:在历史记录中向前或身后导航;放大或缩小;进行文本搜索;及更多事情。
注意 , 要想让妳的活动(Activity)能够访问到互联网并且在一个网页视图(WebView)里显示网页,妳必须向妳的安卓清单(Android Manifest)文件中加入互联网( INTERNET )权限:
<uses-permission android:name = "android.permission.INTERNET" />
它必须是manifest元素的一个子代元素。
欲知更多信息,则阅读 在网页视图中构建网页应用 。
默认情况下,WebView不提供类似于浏览器的部件,不启用JavaScript,并且网页错误也会被忽略。如果妳的目的只是为了在界面上显示一些HTML内容的话,那么,这应当没什么问题;用户只需要观看该网页,不需要与之交互,而网页本身也不需要与用户交互。如果妳想要呈现出一个完整功能的网页浏览器的话,则,妳可能应当带上一个URL 意图(Intent)来调用浏览器(Browser)应用程序,而不是在WebView 中显示它。例如:
Uri uri = Uri . parse ( "http://www.example.com" );
Intent intent = new Intent ( Intent . ACTION_VIEW , uri );
startActivity ( intent );
阅读 意图 以了解更多信息。
要想在妳自己的活动中提供一个网页视图的话,则, 在妳的布局中包含一个 <WebView> ,或者, 在 onCreate() 函数中将整个活动窗口设置为一个网页视图:
WebView webview = new WebView ( this );
setContentView ( webview );
然后载入目标网页:
// 最简单的用法:注意,如果 在载入页面时出错 的话,也 不会 抛出异常 (参考后 文 ) 。
webview . loadUrl ( "http://slashdot.org/" );
// 或者 ,妳也可以载入一整个 HTML字符串 :
String summary = "<html><body>You scored <b>192</b> points.</body></html>" ;
webview . loadData ( summary , "text/html" , null );
// ... 不过,要注意,对于 这个HTML 能够做的事情,有一些限制。
// 参考 loadData() 和 loadDataWithBaseURL() 的 JavaDoc 以了解更多细节。
WebView有多个可自定义的点,妳可以利用这些点来加入自己的行为。以下列出:
•. 创建 及设置一个 WebChromeClient 子类 。 当某些会影响浏览器界面的事情发生时,就会调用这个类,例如,进度 值更新以及 JavaScript弹出 框信息 都会发送到这里 (参考 调试任 务 ) 。
•. 创建 及设置一个 WebViewClient 子类 。 当某些会影响到内容的渲染结果的事情发生时,会调用它,例如,网页内容错误或者表单提交 。 妳还可以在这里拦截对于 URL 的载入动作 (通过 shouldOverrideUrlLoading() ) 。
•. 修改 WebSettings ,例如,使用 setJavaScriptEnabled() 来启用JavaScript。
•. 使用 addJavascriptInterface(Object, String) 方法 来将 Java 对象注入到WebView 中。 用这个方法,就可以将 Java对象注入 到网页的 JavaScript 上下文中,这样,它们就可以被网页中的JavaScript 访问到了。
以下是一个更复杂的示例,展示了错误处理、设置和进度提示:
// 让我们在活动的标题栏上显示进度条,就像浏览器应用程序那样。
getWindow (). requestFeature ( Window . FEATURE_PROGRESS );
webview . getSettings (). setJavaScriptEnabled ( true );
final Activity activity = this ;
webview . setWebChromeClient ( new WebChromeClient () {
public void onProgressChanged ( WebView view , int progress ) {
// 活动和网页视图是以不同的尺度来衡量进度 值的。
// 进度达到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) ( 从应用编程接口级别 CUPCAKE 开始引入 ) 。
注意 :在高度或宽度 被设置为 WRAP_CONTENT 的情况下,如果启用缩放,可能 会引起未知行为 ,应当避免这样做 。
出于显而易见的安全性考虑,妳的应用程序会拥有它自己的缓存、cookie存储等等。——它不会与浏览器(Browser)应用共享数据。
默认情况 下,来自HTML 的要求打开新窗口的请求会被无视。无论它们 是由JavaScript 要求打开的,还是由链接的目标属性要求打开的,都是如此。 妳可以对 WebChromeClient 进行 自定义,以提供自己 的 关于打开多个窗口 的行为, 以及,按照自己喜欢的方式 来渲染它们。
当屏幕的朝向发生变化,或者别的属性发生变化时,活动 (Activity)的标准行为是, 被销毁然后重建。 这将会导致 WebView重新载入当前页面。如果 妳不想发生这种行为,那么, 妳可以对妳的 Activity进行设置 , 让它处理 orientation 和 keyboardHidden 这些变更, 而让 WebView保持原样 。 它会在适当的情况下重新改变自身的朝向。阅读 处理运行 时变更 以了解更多关于如何处理运行时的配置变化的信息。
设备的屏幕密度取决于屏幕的分辨率。一个具有较低密度的屏幕,其上每英寸的像素个数较少,而一个具有较高密度的屏幕呢,每英寸的像素个数就多一些了——有些时候会显著地多一些。屏幕的密度是非常重要的,因为,在其它参数相同的情况下,一个按照屏幕像素值来看具有固定的高度和宽度的界面元素(例如一个按钮),在较低密度的屏幕上,会显得大一些,在较高密度的屏幕上,会显得小一些。出于简单起见,安卓将所有的实际屏幕密度归类为三个大的密度分类:高(high)、中(medium)和低(low)。
默认情况 下, WebView 会缩放网页内容,使得, 它按照在一个中等密度屏幕上的尺寸 来显示。于是 ,在一个高密度屏幕上,它 会被应用 1.5 倍的缩放 (因为 这种密度 的屏幕 上的像素点会小一些 ) , 而在一个低密度屏幕上呢, 它会被应用 0.75 倍的缩放 (因为 这种密度的屏幕上的像素点会大一些 ) 。 自从应用编程接口级别 ECLAIR 开始 , WebView支持 了 DOM 、 CSS 和元标记特性,以帮助妳 (网页开发 者 )区分 出不同的屏幕密度。
以下是一些特性的汇总,妳可以利用它们来处理不同的屏幕密度:
•. window.devicePixelRatio 这个 DOM属性 。 这个属性的值指定了 在当前设备上使用的默认缩放因子。例如 ,假设 window.devicePixelRatio 这个值是 "1.0" ,则表明, 此 设备被认为是一个中等密度(mdpi)的设备,因而 ,不会对网页进行默认的缩放;如果 它的值是 "1.5" ,则表明, 此 设备被认为是一个高密度(hdpi)的设备,因而 ,网页中的内容会被放大 1.5 倍;如果 它的值是 "0.75" ,则表明, 此设备被认为是一个低密度 (ldpi) 的设备,因而,网页中的内容会被缩小至 0.75 倍。
•. -webkit-device-pixel-ratio 这个 CSS媒体查询属性。使用 这个属性 来指定,当前样式单应当被应用到哪种屏幕密度 上去。对应 的值应当是 "0.75" 、 "1" 或 "1.5" ,分别表示,当前样式是对应于 低密度、中等密度或高密度的屏幕的设备的。例如:
<link rel = "stylesheet" media = "screen and (-webkit-device-pixel-ratio:1.5)" href = "hdpi.css" />
hdpi.css 这个样式单文件,只会对那些屏幕像素比率 为 1.5 的设备生效, 即为高密度的像素比率。
要想在 妳的应用程序中支持内嵌的 HTML5视频 的话,则, 妳需要开启硬件加速,并且设置 一个 WebChromeClient 。 要想支持全屏的话,则必须实现 onShowCustomView(View, WebChromeClient.CustomViewCallback) 和 onHideCustomView() ,而 getVideoLoadingProgressView() 是可选的。
自此版本开始引入 : 应用编程接口级别1
针对电话号码的URI模式。
常量值:"tel:"
自此版本开始引入 : 应用编程接口级别1
将指定的 Java对象注入 到这个WebView 中去。 这个对象会以指定的名字被注入到主帧的JavaScript 上下文中。 这就使得,可以从 JavaScript 中访问到该Java 对象的方法。对于那些针对应用编程接口级别 JELLY_BEAN_MR1 及更高版本的系统开发的应用程序,只有那些 以 JavascriptInterface 注解过的公有方法才能够被JavaScript 访问到。对于那些针对应用编程接口级别 JELLY_BEAN 及更低版本的系统开发的应用程序,所有 的公有方法 (包括那些继承而来 的方法 ) 都可被访问到, 请阅读下面针对实现代码 的重要安全提示。
注意,在页面下次(重新)载入之前,所注入的对象不会出现在JavaScript 中。例如:
class JsObject {
@JavascriptInterface
public String toString () { return "injectedObject" ; }
}
webView . addJavascriptInterface ( new JsObject (), "injectedObject" );
webView . loadData ( "" , "text/html" , null );
webView . loadUrl ( "javascript:alert(injectedObject.toString())" );
重要:
•. 这个方法可用来让 JavaScript控制 其宿主应用程序。 这是一个强大的功能,但是, 也对那些针对 JELLY_BEAN 及更低版本系统而开发的应用程序带来了一个安全隐患。对于那些针对 比 JELLY_BEAN 高的版本的系统开发的应用程序呢,如果它们 是运行于版本低于4.2 的安卓系统上,则仍然 是存在安全隐患的。使用 此方法的最安全的方式是, 将运行目标设置为 JELLY_BEAN_MR1 ,并且确保,只有 在运行于安卓4.2 或更高版本的系统上时,才会调用这个方法。 在这些较低版本的系统中, JavaScript 可以使用反射来访问 到被注入的对象的公有字段。 如果妳在一个包含着不可信任的内容的WebView 中使用这个方法的话,则,可能 会让攻击者 用妳未预料到的方式来操纵宿主应用程序 ,从而 以宿主应用程序的权限来执行Java 代码。因此 ,当妳在一个可能包含着不被信任的内容的WebView 中使用这个方法时,请格外小心。
•.JavaScript是在这个WebView 的一个私有的后台线程中与Java 对象进行交互的。因此,要注意确保线程安全性。
•. 该Java对象的字段是不可访问的。
•. 对于针对应用编程接口级别 LOLLIPOP 及更高版本的系统开发的应用程序, 被注入的Java 对象的各个方法是可以在JavaScript 中枚举得到的。
object |
要注入到这个WebView 的JavaScript 上下文中去的Java 对象。空值(Null)会被无视。 |
name |
用来将该对象暴露在JavaScript中的名字 |
自此版本开始引入 : 应用编程接口级别1
查询,此WebView 是否拥有一个后退历史项。
•.true 当且仅当此WebView拥有一个后退历史项时,返回真。
自此版本开始引入 : 应用编程接口级别1
查询,此WebView 是否拥有一个前进历史项。
•.true 当且仅当此WebView拥有一个前进历史项时,返回真。
自此版本开始引入 : 应用编程接口级别1
载入指定的URL。
url |
要载入的资源的URL |
自此版本开始引入: 应用编程接口级别8
载入指定的URL,并且提交指定的额外HTTP协议头。
url |
要载入的资源的URL |
additionalHttpHeaders |
在针对此URL 的HTTP 请求中要使用的额外协议头,以名/值的形式储存在映射对象中。注意,如果此映射中包含着一些会被此WebView 默认设置的协议头的话,例如那些缓存控制、接受类型或浏览器字符串(User-Agent)等属性,则,它们的值可能会被此WebView 的默认值覆盖掉。 |
自此版本开始引入: 应用编程接口级别11
将当前视图保存为一个网页归档。
filename |
要用来保存该归档的文件名 |
自此版本开始引入 : 应用编程接口级别1
注册一个接口,该接口会在以下情况下被调用:当前内容无法被渲染引擎处理,因而应当下载到本地。它将会替换掉当前的处理器。
listener |
DownloadListener的一个实现 |
自此版本开始引入: 应用编程接口级别3
向WebView告知网络状态。它被用来设置JavaScript属性window.navigator.isOnline以及产生HTML5 的5.7.7小节中说明的在线/离线事件。
networkUp |
一个逻辑值,表明网络是否可用 |
自此版本开始引入 : 应用编程接口级别1
设置铬(chrome)处理器。这是 WebChromeClient 的一个实现,用来处理JavaScript对话框、网站标志图片、标题和进度。它会替换掉当前的处理器。
client |
WebChromeClient的一个实现 |
自此版本开始引入 : 应用编程接口级别1
设置一个WebViewClient,用于接收各种各样的通知及请求。它会替换掉当前的处理器。
client |
一个WebViewClient实现 |
自此版本开始引入 : 应用编程接口级别1
停止当前的载入动作。
未知美人
未知美人
羽化成仙
Your opinionsHxLauncher: Launch Android applications by voice commands