StupidBeauty
Read times:1357Posted at: - no title specified

安卓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窗口管理

出于显而易见的安全性考虑,妳的应用程序会拥有它自己的缓存、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视频支持

要想在 妳的应用程序中支持内嵌的 HTML5视频 的话,则, 妳需要开启硬件加速,并且设置 一个 WebChromeClient 要想支持全屏的话,则必须实现 onShowCustomView(View, WebChromeClient.CustomViewCallback) onHideCustomView() ,而 getVideoLoadingProgressView() 是可选的。

常量

public static final  String SCHEME_TEL

自此版本开始引入 应用编程接口级别1

针对电话号码URI模式

常量值:"tel:"

公有方法

public void  addJavascriptInterface  ( Object  object,  String  name)

自此版本开始引入 应用编程接口级别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中的名字

public boolean canGoBack ()

自此版本开始引入 应用编程接口级别1

查询,此WebView 是否拥有一个后退历史项。

返回
  • •.true 当且仅当此WebView拥有一个后退历史项时,返回真。

public boolean canGoForward ()

自此版本开始引入 应用编程接口级别1

查询,此WebView 是否拥有一个前进历史项。

返回
  • •.true 当且仅当此WebView拥有一个前进历史项时,返回真。

public void  loadUrl  ( String  url)

自此版本开始引入 应用编程接口级别1

载入指定URL

参数

url

要载入的资源的URL

public void  loadUrl  ( String  url,  Map < String String > additionalHttpHeaders)

自此版本开始引入: 应用编程接口级别8

载入指定URL,并且提交指定的额外HTTP协议头。

参数

url

要载入的资源的URL

additionalHttpHeaders

在针对此URL 的HTTP 请求中要使用的额外协议头,以名/值的形式储存在映射对象中。注意,如果此映射中包含着一些会被此WebView 默认设置的协议头的话,例如那些缓存控制、接受类型或浏览器字符串(User-Agent)等属性,则,它们的值可能会被此WebView 的默认值覆盖掉。

public void  saveWebArchive  ( String  filename)

自此版本开始引入: 应用编程接口级别11

将当前视图保存为一个网页归档。

参数

filename

要用来保存该归档的文件名

public void  setDownloadListener  ( DownloadListener  listener)

自此版本开始引入 应用编程接口级别1

注册一个接口,该接口会在以下情况下被调用:当前内容无法被渲染引擎处理,因而应当下载到本地。它将会替换掉当前的处理器。

参数

listener

DownloadListener的一个实现

public void  setNetworkAvailable  (boolean networkUp)

自此版本开始引入: 应用编程接口级别3

WebView告知网络状态。它被用来设置JavaScript属性window.navigator.isOnline以及产生HTML5 的5.7.7小节中说明的在线/离线事件。

参数

networkUp

一个逻辑值,表明网络是否可用

public void  setWebChromeClient  ( WebChromeClient  client)

自此版本开始引入 应用编程接口级别1

设置铬(chrome)处理器。这是 WebChromeClient 的一个实现,用来处理JavaScript对话框、网站标志图片、标题和进度。它会替换掉当前的处理器。

参数

client

WebChromeClient的一个实现

public void  setWebViewClient  ( WebViewClient  client)

自此版本开始引入 应用编程接口级别1

设置一个WebViewClient,用于接收各种各样的通知及请求。它会替换掉当前的处理器。

参数

client

一个WebViewClient实现

public void  stopLoading  ()

自此版本开始引入 应用编程接口级别1

停止当前的载入动作。

未知美人

未知美人

羽化成仙

Your opinions

Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands