Android API 25 (Android 7.1.1) 

WebView

public class WebView

extends AbsoluteLayout implements ViewTreeObserver.OnGlobalFocusChangeListener,

ViewGroup.OnHierarchyChangeListener

 

java.lang.Object

   ↳android.view.View

    ↳android.view.ViewGroup

     ↳android.widget.AbsoluteLayout

      ↳android.webkit.WebView

 


【概述】

显示网页的视图。此类是您可以滚动自己的Web浏览器或只显示您的活动中的一些在线内容的基础。 它使用WebKit渲染引擎来显示网页,并包括通过历史记录向前和向后浏览,放大和缩小,执行文本搜索等方法。

请注意,为了让您的Activity访问Internet并在WebView中加载网页,您必须将INTERNET权限添加到Android清单文件中:

INTERNET" />

这必须是元素的子元素。

 

有关更多信息,请参阅 Building Web Apps in WebView

 


【基本用法】

默认情况下,WebView提供浏览器小部件,不支持JavaScriptweb页面错误被忽略。如果你的目的是只显示一些

HTML 网页作为UI界面的一部分,这可能是好的。用户不需要与网页交互

如果你真的想要一个成熟的web浏览器,那么你可能想和一个URL调用浏览器应用程序的意图,而不是显示

WebView。例如:

 Uri uri = Uri.parse("http://www.example.com");

 Intent intent = new Intent(Intent.ACTION_VIEW, uri);

 startActivity(intent);

有关详细信息,请参阅Intent

 

要在自己的Activity中提供WebView,请在布局中包含,或在onCreate()中将整个活动窗口设置为

WebView

 WebView webview = new WebView(this);

 setContentView(webview);

然后加载所需的网页:

//最简单的用法:注意不会抛出异常

 //如果加载此页面时出错(见下文)。

  webview.loadUrl(“http://slashdot.org/”);

 

// 或者,您也可以加载HTML字符串:

  String summary =“ You scored 192 points.

  webview.loadData(summary,“text / html”,null);

 // ...但是请注意这对HTML有限制。

 //有关更多信息,请参阅JavaDocs的loadData()和loadDataWithBaseURL()。

 

WebView有几个自定义点,您可以添加自己的行为。 这些是:

· 创建和设置WebChromeClient子类。当浏览器的UI发生变化时调用,如:进度条更改、JavaScript的窗口。

(见Debugging Taskshttp://developer.android.com/tools/debugging/index.html)

· 创建和设置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) {

//Activities和WebViews以不同的尺度衡量进度。

//当达到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)(在API 3引入)。

注意:如果高度或宽度设置为WRAP_CONTENT,则使用缩放可能会导致未定义的行为,应该避免。

 


【Cookie和窗口管理】

为了安全起见,你的应用程序需要使用自己的缓存,它不共享浏览器应用程序的数据。

默认情况下,通过HTML打开新窗口的请求被忽略。无论是通过JavaScript还是由连接上的target属性打开,都是如此。你可以自定义WebChromeClient以提供您自己的行为,以打开多个窗口,并以任何方式呈现它们。

当设备定向或任何其他配置更改时,将销毁并重新创建活动的标准行为。这将导致WebView重新加载当前页面。

如果你不希望出现这种情况,您可以设置你的Activity来处理方向和键盘隐藏的更改,然后单独退出WebView。它会根据需要自动重新适配自己。运行时如何处理配置更改请阅读更多信息,Handling Runtime Changes 。

 


【构建支持不同的屏幕密度的网页】

设备的屏幕密度基于屏幕分辨率。低密度的屏幕每英寸具有较少的可用像素,高密度的屏幕每英寸具有更多的像素。屏幕的密度是很重要的,因为在其它条件相同的情况下,高度和宽度根据屏幕像素定义的UI元素(例如按钮)将在较低密度屏幕上显得较大,而在较高密度屏幕上较小。为了简单起见,Android将所有实际屏幕密度压缩为三个广义密度:高,中和低。

 

默认情况下,WebView缩放网页,使其以与中等密度屏幕上默认外观相匹配的尺寸绘制。 因此,它在高密度屏幕上应用1.5倍缩放(因为其像素较小),在低密度屏幕上应用0.75倍缩放(因为其像素更大)。 从API 5开始,WebView支持DOM,CSS和meta标签的功能,以帮助您作为一个web开发目标不同的屏幕密度的屏幕。

 

以下是可用于处理不同屏幕密度的功能摘要:

 

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”,以分别表示样式适用于具有低密度,中密度或高密度屏幕的设备。例如:

hdpi.css样式表仅用于屏幕像素比率为1.5的设备,这是高密度像素比率。

 


【HTML5视频支持】

为了在您的应用程序中支持内嵌HTML5视频,您需要启用硬件加速。


 

【全屏支持】

为了支持全屏——视频或其他HTML内容,您需要设置一个WebChromeClient,并实现onShowCustomView(View,WebChromeClient.CustomViewCallback)和onHideCustomView()。 如果缺少这两种方法中的任一种,那么将不允许web内容进入全屏。 或者,您可以使用getVideoLoadingProgressView()来自定义视频正在加载时显示的视图。

 


【HTML5地理位置API支持】

对于面向Android N及更高版本(API级别> M)的应用,geolocation api仅在安全源(例如https)上受支持。 对于这样的应用程序,对非安全源的地理位置API的请求被自动拒绝,而不调用相应的

onGeolocationPermissionsShowPrompt(String,GeolocationPermissions.Callback)方法。


 

【布局尺寸】

建议将WebView布局高度设置为固定值或MATCH_PARENT,而不是使用WRAP_CONTENT。 当对高度使用MATCH_PARENT时,没有WebView的父级应该使用WRAP_CONTENT布局高度,因为这可能会导致视图大小不正确。

WebView的高度设置为WRAP_CONTENT会启用以下行为:

·HTML主体布局高度设置为固定值。 这意味着相对于HTML正文具有高度的元素可能无法正确调整大小。

·对于针对KITKAT和早期SDK的应用程序,HTML视图meta标签将被忽略,以保留向后兼容性。

不支持使用WRAP_CONTENT的布局宽度。 如果使用这样的宽度,WebView将尝试使用父级的宽度。

 


【指标】

当用户同意时,WebView可能会将匿名诊断数据上传到Google。 这些数据有助于Google改进WebView。 针对已实例化WebView的每个应用程序,基于每个应用程序收集数据。 个别应用程式可以在清单中加入以下标记,借此停用这项功能:

android:value =“true”/>

只有在用户同意并且应用尚未选择停用的情况下,系统才会上传指定应用的数据。

 

【嵌套类】

接口     WebView.FindListener

用于监听查找结果的界面。

类      WebView.HitTestResult

 

接口    WebView.PictureListener

此接口在API级别12中已弃用。此接口现已过时。

类      WebView.VisualStateCallback

回调接口提供给postVisualStateCallback(long,WebView.VisualStateCallback),用于接收关于可视状态的通知。

类      WebView.WebViewTransport

用于跨线程边界返回WebView的传输对象。



【继承自view.ViewGroup的XML属性】

跳转view.ViewGroup

 


【继承自view.View的XML属性】

跳转view.View

 

【公共构造函数】

WebView(Context context)

WebView(Context context, AttributeSet attrs)

WebView(Context context, AttributeSet attrs, int defStyleAttr)

WebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)

 

WebView(Context context, AttributeSet attrs, int defStyleAttr, boolean privateBrowsing)

此构造函数在API级别17中已弃用。不再直接通过WebView支持私有浏览,将在以后的版本中删除。 首选使用

WebSettings,WebViewDatabase,CookieManager和WebStorage来细粒度控制隐私数据。



【公共方法】


addJavascriptInterface

void addJavascriptInterface (Object object, String name)

API 1

将提供的Java对象注入到此WebView中。 使用提供的名称将对象注入到主框架的JavaScript上下文中。 这允许从

JavaScript访问Java对象的方法。 对于定位到API 17及更高版本的应用程序,只能使用JavaScript访问使用

JavascriptInterface注释的公共方法。 对于针对API 16或更低版本的应用程序,可以访问所有公共方法(包括继承

的方法),请参阅下面的重要安全说明以了解其含义。

 

请注意,注入的对象不会出现在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或更早版本的应用程序带来安全风险。如果应用在运行Android 4.2之前版本的设备上运行,那么定位到JELLY_BEAN之后的版本的应用仍然会受到攻击。使用此方法的最安全的方法是定位JELLY_BEAN_MR1并确保仅当在Android 4.2或更高版本上运行时才调用该方法。对于这些较旧的版本,JavaScript可以使用反射来访问注入对象的公共字段。在包含不受信任内容的WebView中使用此方法可能允许攻击者以无意的方式操纵主机应用程序,以主机应用程序的权限执行Java代码。在可能包含不受信任内容的WebView中使用此方法时请格外小心。

·JavaScript与此WebView的私有后台线程上的Java对象进行交互。因此需要小心保持螺纹安全。

·Java对象的字段不可访问。

·对于针对API级别LOLLIPOP及以上的应用程序,注入Java对象的方法可以从JavaScript枚举。

 


canGoBack

boolean canGoBack ()

API 1

获取此WebView是否具有后退历史记录项。

 


canGoForward

boolean canGoForward ()

API 1

获取此WebView是否具有前进历史项。

 


canGoBackOrForward

boolean canGoBackOrForward (int steps)

API 1

获取页面是否可以后退或前进给定数量的步骤。

 


canZoomIn

boolean canZoomIn ()

Added in API level 11,deprecated in API level 17.

获取此WebView是否可以放大。

此方法在API级别17中已弃用。

这种方法容易由于网络呈现和UI线程之间的竞争条件而不准确; 推荐onScaleChanged(WebView,float,float)。

 


canZoomOut

boolean canZoomOut ()

Added in API level 11,deprecated in API level 17.

获取此WebView是否可以缩小。

此方法在API级别17中已弃用。

这种方法容易由于网络呈现和UI线程之间的竞争条件而不准确; 推荐onScaleChanged(WebView,float,float)。

 


capturePicture

Picture capturePicture ()

Added in API level 11,deprecated in API level 19.

使用onDraw(Canvas)获取WebView的位图快照,或使用saveWebArchive(String)将内容保存到文件。

 

获取捕获此WebView的当前内容的新图片。 图片是正在显示的整个文档,并且不限于此WebView当前显示的区域。 此外,该图片是静态副本,并且不受稍后对正在显示的内容的更改的影响。

请注意,由于内部更改,对于11和14之间(包括)的API级别,图片不包括固定位置元素或可滚动div。

注意,从API 17返回的图片只应该绘制到位图支持的画布 - 使用任何其他类型的画布将涉及额外的转换,在内存和性能的成本。 此外,返回的对象不支持createFromStream(InputStream)和writeToStream(OutputStream)方法。

 


clearCache

void clearCache (boolean includeDiskFiles)

API 1

清除资源高速缓存。注意,缓存是每个应用程序,因此这将清除所有使用的WebView的缓存。

 


clearClientCertPreferences

void clearClientCertPreferences (Runnable onCleared)

API 21

清除存储的客户端证书首选项以响应继续/取消客户端证书请求。 请注意,Webview在收到ACTION_STORAGE_CHANGED意图时会自动清除这些首选项。 偏好设置由嵌入程序应用程序创建的所有网络视图共享。

 


clearFormData

void clearFormData ()

API 1

从当前关注的表单字段(如果存在)中删除自动完成弹出式窗口。注意这只会影响自动完成弹出窗口的显示,它不会从这个WebView的存储中删除任何保存的表单数据。 要做到这一点,使用clearFormData()。

 


clearHistory

void clearHistory ()

API 1

告诉此WebView清除其内部后退/前进列表。

 


clearMatches

void clearMatches ()

API 3

清除由findAllAsync(String)创建的突出显示的周围文本匹配。

 


clearSslPreferences

void clearSslPreferences ()

API 1

清除存储的SSL首选项表,以响应继续执行SSL证书错误。

 


clearView

void clearView ()

Added in API level 11,deprecated in API level 18.

使用WebView.loadUrl(“about:blank”)可靠地重置视图状态和释放页面资源(包括任何正在运行的JavaScript)。

 


computeScroll

void computeScroll ()

API 1

如果需要,父进程调用以请求子进程更新mScrollX和mScrollY的值。 如果孩子使用Scroller对象来动画滚动,通常会这样做。



copyBackForwardList

WebBackForwardList copyBackForwardList()

API 1

获取此WebView的WebBackForwardList。 这包含用于查询历史堆栈中的每个项目的后退/前进列表。 这是私有

WebBackForwardList的副本,因此它只包含当前状态的快照。 对此方法的多个调用可能返回不同的对象。 从此方法返回的对象将不会更新以反映任何新状态。

 


createPrintDocumentAdapter

PrintDocumentAdapter createPrintDocumentAdapter()

Added in API level 19,deprecated in API level 21.

使用createPrintDocumentAdapter(String),它需要用户提供打印文档名称。

 


createPrintDocumentAdapter

PrintDocumentAdapter createPrintDocumentAdapter (String documentName)

API 21

创建一个PrintDocumentAdapter,提供此Webview的内容以供打印。 适配器通过将Webview内容转换为PDF流来工作。 在转换过程中无法绘制Web视图 - 任何此类绘制未定义。 建议使用专用的离屏Webview进行打印。 如果需要,应用程序可以通过使用定制的PrintDocumentAdapter实例临时隐藏可见的WebView,该实例包装在返回的对象上并观察onStart和onFinish方法。 有关详细信息,请参阅PrintDocumentAdapter。

 


createWebMessageChannel

WebMessagePort[] createWebMessageChannel ()

API 23

创建消息通道以与JS通信,并返回表示此消息通道的端点的消息端口。 这里介绍了HTML5消息通道功能

返回的消息通道被纠缠并且已处于启动状态。

 


destroy

void destroy ()

API 1

销毁此WebView的内部状态。 在从视图系统中删除此WebView之后,应调用此方法。 在销毁后,此WebView上不能调用其他方法。

 


dispatchKeyEvent

boolean dispatchKeyEvent (KeyEvent event)

API 1

将键事件分派到焦点路径上的下一个视图。此路径从视图树的顶部向下延伸到当前聚焦的视图。如果这个视图有焦点,它会调度自己。否则,它将沿着焦点路径分派下一个节点。此方法也会触发任何键监听器。

 


documentHasImages

void documentHasImages (Message response)

API 1

查询文档以查看其是否包含任何图像引用。消息对象将被分派,arg1如果找到图像则设置为1,如果文档没有引用任何图像,则为0。

 


enableSlowWholeDocumentDraw

void enableSlowWholeDocumentDraw ()

API 21

对于定位到L发行版的应用程序,WebView具有新的默认行为,通过智能选择需要绘制的HTML文档部分来减少内存占用并提高性能。 这些优化对开发人员是透明的。 但是,在某些情况下,应用程式开发人员可能想要停用它们:

·当应用程序使用onDraw(Canvas)进行自己的绘图并访问页面的可见部分以外的部分。

·当应用程序使用capturePicture()捕获非常大的HTML文档。 请注意,capturePicture是一个已弃用的API。

启用绘制整个HTML文档具有显着的性能成本。 在创建任何WebView之前应该调用此方法。

 


evaluateJavascript

void evaluateJavascript (String script, ValueCallback resultCallback)

API 19

异步地在当前显示的页面的上下文中评估JavaScript。 如果非空,| resultCallback | 将调用从该执行返回的任何结果。 此方法必须在UI线程上调用,并且回调将在UI线程上进行。

兼容性说明。面向N或更高版本的应用程序,来自空WebView的JavaScript状态不再在诸如loadUrl(String)之类的导航中持久保存。 例如,在调用loadUrl(String)之前定义的全局变量和函数不会存在于加载的页面中。 应用程序应该使用addJavascriptInterface(Object,String)来跨导航保存JavaScript对象。

 


findAddress

String findAddress(String addr)

获取由物理位置的地址组成的第一个子字符串。目前,只检测美国的地址,包括:

·房子号码

·街道名称

·街道类型(道路,圆形等),拼写或缩写

·城市名称

·一个州或领地,或者拼写出来的,或者两个字母的

·可选的5位数或9位数邮政编码

所有名称必须正确大写,并且邮政编码(如果存在)必须对该州有效。街道类型必须是标准的USPS拼写或缩写。 州或领地也必须使用USPS标准拼写或缩写。 房子号码不能超过五位数。

 


findAll

int findAll (String find)

Added in API level 3,deprecated in API level 16.

首选findAllAsync(String)。

在页面上查找find的所有实例,并突出显示它们。 通知任何已注册的WebView.FindListener。

 


findAllAsync

void findAllAsync (String find)

API 16

在页面上查找find的所有实例,并以异步方式突出显示它们。 通知任何已注册的WebView.FindListener。 对此的连续调用将取消任何未完成的搜索。

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. 箭头函数的基础使用
  3. NPM 和webpack 的基础使用
  4. Python list sort方法的具体使用
  5. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  6. python list.sort()根据多个关键字排序的方法实现
  7. Android(安卓)ImageView使用网上图片资源
  8. Android中GPRS 开关
  9. Android(安卓)使用Eclipse 构建K9

随机推荐

  1. android 混淆
  2. Android 3.0 Platform Highlights
  3. Android进度条实例
  4. Android使用意图链接活动和意图筛选器
  5. Android获取IMEI和ICCID
  6. android美女更衣
  7. Android 震动 和 停止 代码
  8. Android Volley完全解析
  9. (64位)ubuntu 11.10编译android 2.3准备的
  10. Android使用系统API进行音视频编码