Android WebView基础

来源:互联网 发布:com域名多少钱一年 编辑:程序博客网 时间:2024/06/05 22:53

此篇介绍WebView的相关知识


1.获取WebSettings对象
WebSettings settings=webview.getSettings();


2.设置setting属性

settings.setJavaScriptEnabled(true);//支持js
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);//设置缓存方式  不使用缓存只从网络获取数据
settings.setDomStorageEnabled(true);//开启DOM storage API功能(HTML5 提供的一种标准的接口,主要将键值对存储在本地,在页面加载完毕后可以通过 JavaScript 来操作这些数据。)
settings.setDefaultTextEncodingName("utf-8");//设置默认编码
settings.setUseWideViewPort(false);//将图片调整到适合webview的大小
settings.setSupportZoom(true);//支持缩放
settings.setDisplayZoomControls(false);//设定缩放控件隐藏
settings.setAllowFileAccess(true);//设置可以访问文件
settings.setBuiltInZoomControls(true);//设置支持缩放
settings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口
settings.setLoadWithOverviewMode(true);//缩放至屏幕的大小
settings.setLoadsImagesAutomatically(true);//支持自动加载图片


3.设置webview监听

webview.setWebViewClient(myWebViewClient);//WebViewClient监听
webview.setWebChromeClient(myWebChromeClient);//WebChromeClient 监听
webview.setDownloadListener(new MyDownloadListenter());//DownloadListener 监听


4.webview加载网页

webview.loadUrl(firsturl);


5.添加js交互接口类,并起别名 imagelistner

webview.addJavascriptInterface(new JavascriptInterface(this), "imagelistner");


6.JavascriptInterface接口

@SuppressLint("JavascriptInterface")
public class JavascriptInterface {

private Context context;
public JavascriptInterface(Context context) {
this.context=context;
}


@android.webkit.JavascriptInterface
public void openImage(String img) {
list.removeAll(list);
list.add(img);
Intent intent=new Intent();
intent.putStringArrayListExtra("list", list);
intent.putExtra("position", 0);
intent.setClass(context, ShowBigImageviewActivity.class);
context.startActivity(intent);
}
}

/**
* 匹配h5 页面中的图片路径
* */

private void addImageClickListner() {
//这段js函数的功能就是,遍历所有的img几点,并添加onclick函数,在还是执行的时候调用本地接口传递url过去
String method="javascript:(function(){"
+ "var objs = document.getElementsByTagName(\"img\"); "
+ "for(var i=0;i<objs.length;i++)  " + "{"
+ "    objs[i].onclick=function()  " + "    {  "
+ "        window.imagelistner.openImage(this.src);  "
+ "    }  " + "}" + "})()";
webview.loadUrl(method);
Log.d("WebViewActivity", "method----:" + method);
}


7.WebViewClient

/**
* WebViewClient
* 说明:主要用来辅助WebView处理各种通知、请求等事件,通过setWebViewClient方法设置

* 方法1:shouldOverrideUrlLoading
* 说明:当点击页面中的链接后会在WebView加载URL前回调此方法 一般点击一个链接此方法调用一次。
*     此方法返回值意义:return true:则在打开新的url时WebView就不会再加载这个url了 所有处理都需要在WebView中操作 包含加载。
*     return false:则系统就认为上层没有做处理 接下来还是会继续加载这个url的 默认return false。
* 方法2:shouldInterceptRequest
* 说明:加载网页时替换某个资源 比如在加载一个网页时 需要加载一个logo图片 而我们想要替换这个logo图片 用我们assets目录下的一张图片替代  
*     我们知道我们在加载一个网页的同时也会加载js,css,图片等资源 所以会多次调用shouldInterceptRequest方法 
*     我们可以在shouldInterceptRequest中进行图片替换。 
*     shouldInterceptRequest有两个重载:
*     ①public WebResourceResponse shouldInterceptRequest (WebView view, String url) 【已过时】 
*     ②public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)
* 方法3:onPageStarted
* 说明:开始加载网页
* 方法4: onPageFinished
* 说明:网页加载完成  
* 方法5:onReceivedError
* 说明:网页加载错误时处理
* 方法6:onReceivedSslError
* 说明:处理https请求,为WebView处理ssl证书设置WebView默认是不处理https请求的 需要在WebViewClient子类中重写父类的
* */

WebViewClient myWebViewClient = new WebViewClient() { 

public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return false;
};

public void onPageStarted(WebView view, String url, android.graphics.Bitmap favicon) {
super.onPageStarted(view, url, favicon);  
       //开始加载网页时处理 如:显示"加载提示" 的加载对话框
};

public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//网页加载完成时处理  如:让 加载对话框 消失  
            if(!(firsturl.equals(url))){
            closelayout.setVisibility(View.VISIBLE);
}
            //html加载完成之后,添加监听图片的点击js函数
addImageClickListner();
};

public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);  
       //加载网页失败时处理 如:提示失败,或显示新的界面
textview.setVisibility(View.VISIBLE);//textview显示
progressbar.setVisibility(View.GONE);//progressbar隐藏
webview.setVisibility(View.GONE);//webview隐藏
textview.setText(description);
};

public void onReceivedSslError(WebView view, android.webkit.SslErrorHandler handler, android.net.http.SslError error) {
handler.proceed();//接受信任所有网站的证书 
                         handler.cancel();//默认操作 不处理  
                        handler.handleMessage(null);//可做其他处理
};
};


8.WebChromeClient

/**
* WebChromeClient
* 说明:主要用来辅助WebView处理Javascript的对话框、网站图标、网站标题以及网页加载进度等

* 方法1:onProgressChanged
* 说明:监听网页加载进度 progress表示当前页面加载的进度 为1至100的整数
* 方法2:onReceivedTitle
* 说明:监听网页标题 : 比如百度页面的标题是 百度一下,你就知道 
* 方法3:onReceivedIcon
* 说明:监听网页图标
* */

WebChromeClient myWebChromeClient=new WebChromeClient(){

public void onProgressChanged(WebView view, int newProgress) {
if(newProgress==100){  
                progressbar.setVisibility(View.GONE);//加载完网页进度条消失  
                webview.setVisibility(View.VISIBLE);//webview显示
                textview.setVisibility(View.GONE);//textview隐藏
            }else{  
            progressbar.setVisibility(View.VISIBLE);//开始加载网页时显示进度条  
            progressbar.setProgress(newProgress);//设置进度值 
            webview.setVisibility(View.GONE);//webview隐藏
            textview.setVisibility(View.GONE);//textview隐藏
            } 
};

public void onReceivedTitle(WebView view, String title) {
if("".equals(title)||"null".equals(title)||null==title){
titletv.setText("详情页");
}else{
titletv.setText(title);
}
};

public void onReceivedIcon(WebView view, android.graphics.Bitmap icon) {

};
};


9.DownloadListener

/**
* DownloadListener
* 说明:通常webview渲染的界面中含有可以下载文件的链接 点击该链接后 应该开始执行下载的操作并保存文件到本地中。

* 方法1:onDownloadStart
* 说明:下载任务 主要有两种方式 1:自定义下载任务 2:调用系统的download的模块

* */

class MyDownloadListenter implements DownloadListener{


@Override
public void onDownloadStart(String arg0, String arg1, String arg2,
String arg3, long arg4) {
         Uri uri=Uri.parse(arg0);
         Intent intent=new Intent(Intent.ACTION_VIEW, uri);
         startActivity(intent);
}

}


10.返回

if(webview.canGoBack()) {//当webview不是处于第一页面时 返回上一个页面  
                webview.goBack();   
            }else{//当webview处于第一页面时,直接退出程序  
            finish();
    overridePendingTransition(0,R.anim.activity_right_open);  
 } 


最后附webview settings的一些常用属性


WebSettings webSettings=webView.getSettings();
  1. setAllowContentAccess (boolean allow) 
    是否允许在WebView中访问内容URL(Content Url),默认允许。内容Url访问允许WebView从安装在系统中的内容提供者载入内容。

  2. setAllowFileAccess (boolean allow) 
    是否允许访问文件,默认允许。注意,这里只是允许或禁止对文件系统的访问,Assets 和 resources 文件使用file:///android_assetfile:///android_res仍是可访问的。

  3. setAllowFileAccessFromFileURLs (boolean flag) 
    是否允许运行在一个URL环境(the context of a file scheme URL)中的JavaScript访问来自其他URL环境的内容,为了保证安全,应该不允许。也请注意,这项设置只影响对file schema 资源的JavaScript访问,其他形式的访问,例如来自图片HTML单元的访问不受影响。为了防止相同的域策略(same domain policy)对ICE_CREAM_SANDWICH以及更老机型的侵害,应该显式地设置此值为false。

  4. setAllowUniversalAccessFromFileURLs (boolean flag) 
    是否允许运行在一个file schema URL环境下的JavaScript访问来自其他任何来源的内容,包括其他file schema URLs. 参见setAllowFileAccessFromFileURLs(boolean),为了确保安全,应该设置为不允许,注意这项设置只影响对file schema 资源的JavaScript访问,其他形式的访问,例如来自图片HTML单元的访问不受影响。为了防止相同的域策略(same domain policy)对ICE_CREAM_SANDWICH以及更老机型的侵害,应该显式地设置此值为false。ICE_CREAM_SANDWICH_MR1 以及更老的版本此默认值为true,JELLY_BEAN以及更新版本此默认值为false

  5. setAppCacheEnabled (boolean flag) 
    应用缓存API是否可用,默认值false, 结合setAppCachePath(String)使用。

  6. setAppCachePath(String) 
    设置应用缓存文件的路径。为了让应用缓存API可用,此方法必须传入一个应用可写的路径。该方法只会执行一次,重复调用会被忽略。

  7. setAppCacheMaxSize (long appCacheMaxSize) 
    已废弃。设置应用缓存内容的最大值。所传值会被近似为数据库支持的最近似值,因此这是一个指示值,而不是一个固定值。所传值若小于数据库大小不会让数据库调整大小。默认值是MAX_VALUE,建议将默认值设置为最大值。

  8. setBlockNetworkImage (boolean flag) 
    是否禁止从网络(通过http和https URI schemes访问的资源)下载图片资源,默认值为false。注意,除非getLoadsImagesAutomatically()返回true,否则该方法无效。还请注意,即使此项设置为false,使用setBlockNetworkLoads(boolean)禁止所有网络加载也会阻止网络图片的加载。当此项设置的值从true变为false,WebView当前显示的内容所引用的网络图片资源会自动获取。

  9. setBlockNetworkLoads (boolean flag) 
    是否禁止从网络下载数据,如果app有INTERNET权限,默认值为false,否则默认为true。使用setBlockNetworkImage(boolean) 只会禁止图片资源的加载。注意此值由true变为false,当前WebView展示的内容所引用的网络资源不会自动加载,直到调用了重载。如果APP没有INTERNET权限,设置此值为false会抛出SecurityException。

  10. setBuiltInZoomControls (boolean enabled) 
    是否使用内置的缩放机制。内置的缩放机制包括屏幕上的缩放控件(浮于WebView内容之上)和缩放手势的运用。通过setDisplayZoomControls(boolean)可以控制是否显示这些控件,默认值为false。

  11. setCacheMode (int mode) 
    重写使用缓存的方式,默认值LOAD_DEFAULT。缓存的使用方式基于导航类型,正常的页面加载,检测缓存,需要时缓存内容复现。导航返回时,内容不会复现,只有内容会从缓存盘中恢复。该方法允许客户端通过指定LOAD_DEFAULT, LOAD_CACHE_ELSE_NETWORK, LOAD_NO_CACHE or LOAD_CACHE_ONLY的其中一项来重写其行为。

  12. setCursiveFontFamily (String font) 
    设置WebView字体库字体,默认“cursive”

  13. setDatabaseEnabled (boolean flag) 
    数据库存储API是否可用,默认值false。如何正确设置数据存储API参见setDatabasePath(String)。该设置对同一进程中的所有WebView实例均有效。注意,只能在当前进程的任意WebView加载页面之前修改此项,因为此节点之后WebView的实现类可能会忽略该项设置的改变。

  14. setDatabasePath (String databasePath) 
    已废弃,数据库路径由实现(implementation)管理,调用此方法无效。 
    设置数据库的存储路径,为了保证数据库正确运行,该方法必须使用一个应用可写的路径。此方法只能执行一次,重复调用会被忽略。

  15. setDefaultFixedFontSize (int size) 
    设置默认固定的字体大小,默认为16,可取值1到72

  16. setDefaultFontSize (int size) 
    设置默认的字体大小,默认16,可取值1到72

  17. setDefaultTextEncodingName (String encoding) 
    设置默认的字符编码集,默认”UTF-8”.

  18. setDefaultZoom (WebSettings.ZoomDensity zoom) 
    已废弃。设置默认的缩放密度,必须在UI线程调用,默认值MEDIUM.该项设置在新应用中不推荐使用。如果WebView用于展示手机页面,可以通过调整页面的’meta viewport’ 标记中的’width’ 和 ‘initial-scale’属性实现预期效果,对于漏用标记的页面,可以使用setInitialScale(int)和setUseWideViewPort(boolean) .

  19. setDisplayZoomControls (boolean enabled) 
    使用内置的缩放机制时是否展示缩放控件,默认值true。参见setBuiltInZoomControls(boolean).

  20. setDomStorageEnabled (boolean flag) 
    DOM存储API是否可用,默认false。

  21. setEnableSmoothTransition (boolean enable) 
    已废弃,将来会成为空操作(no-op),设置当panning或者缩放或者持有当前WebView的window没有焦点时是否允许其光滑过渡,若为true,WebView会选择一个性能最大化的解决方案。例如过渡时WebView的内容可能不更新。若为false,WebView会保持精度(fidelity),默认值false。

  22. setFantasyFontFamily (String font) 
    设置fantasy字体集(font family)的名字默认为“fantasy”

  23. setFixedFontFamily (String font) 
    设置固定的字体集的名字,默认为”monospace”。

  24. setGeolocationDatabasePath (String databasePath) 
    定位数据库的保存路径,为了确保定位权限和缓存位置的持久化,该方法应该传入一个应用可写的路径。

  25. setGeolocationEnabled (boolean flag) 
    定位是否可用,默认为true。请注意,为了确保定位API在WebView的页面中可用,必须遵守如下约定: 
    (1) app必须有定位的权限,参见ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION; 
    (2) app必须提供onGeolocationPermissionsShowPrompt(String, GeolocationPermissions.Callback)回调方法的实现,在页面通过JavaScript定位API请求定位时接收通知。 
    作为可选项,可以在数据库中存储历史位置和Web初始权限,参见setGeolocationDatabasePath(String).

  26. setJavaScriptCanOpenWindowsAutomatically (boolean flag) 
    让JavaScript自动打开窗口,默认false。适用于JavaScript方法window.open()。

  27. setJavaScriptEnabled (boolean flag) 
    设置WebView是否允许执行JavaScript脚本,默认false,不允许。

  28. setLayoutAlgorithm (WebSettings.LayoutAlgorithm l) 
    设置布局,会引起WebView的重新布局(relayout),默认值NARROW_COLUMNS

  29. setLightTouchEnabled (boolean enabled) 
    已废弃。从 JELLY_BEAN 开始,该设置无效。允许使用轻触摸做出选择和光标悬停。

  30. setLoadWithOverviewMode (boolean overview) 
    是否允许WebView度超出以概览的方式载入页面,默认false。即缩小内容以适应屏幕宽度。该项设置在内容宽度超出WebView控件的宽度时生效,例如当getUseWideViewPort() 返回true时。

  31. setLoadsImagesAutomatically (boolean flag) 
    WebView是否下载图片资源,默认为true。注意,该方法控制所有图片的下载,包括使用URI嵌入的图片(使用setBlockNetworkImage(boolean) 只控制使用网络URI的图片的下载)。如果该设置项的值由false变为true,WebView展示的内容所引用的所有的图片资源将自动下载。

  32. setMediaPlaybackRequiresUserGesture (boolean require) 
    WebView是否需要用户的手势进行媒体播放,默认值为true。

  33. setMinimumFontSize (int size) 
    设置最小的字号,默认为8

  34. setMinimumLogicalFontSize (int size) 
    设置最小的本地字号,默认为8。

  35. setMixedContentMode (int mode) 
    当一个安全的来源(origin)试图从一个不安全的来源加载资源时配置WebView的行为。默认情况下,KITKAT及更低版本默认值为MIXED_CONTENT_ALWAYS_ALLOW,LOLLIPOP版本默认值MIXED_CONTENT_NEVER_ALLOW,WebView首选的最安全的操作模式为MIXED_CONTENT_NEVER_ALLOW ,不鼓励使用MIXED_CONTENT_ALWAYS_ALLOW。

  36. setNeedInitialFocus (boolean flag) 
    调用requestFocus(int, Android.graphics.Rect)时是否需要设置节点获取焦点,默认值为true。

  37. setOffscreenPreRaster (boolean enabled) 
    当WebView切换到后台但仍然与窗口关联时是否raster tiles,打开它可以避免在WebView从后台切换到前台时重新绘制,默认值false。在这种模式下后台的WebView占用更多的内存。请按如下准则显示内存的使用:

    1. WebView的尺寸不能比设备的屏幕尺寸更大;
    2. 限制在少数WebView上使用该模式;
    3. 在可见的WebView和即将显现的WebView上使用;
  38. setPluginState (WebSettings.PluginState state) 
    在API18以上已废弃。未来将不支持插件,不要使用。告诉WebView启用、禁用或者有即用(on demand)的插件,即用模式是指如果存在一个可以处理嵌入内容的插件,会显示一个占位图标,点击时开启。默认值OFF。

  39. setRenderPriority (WebSettings.RenderPriority priority) 
    在API18以上已废弃。不建议调整线程优先级,未来版本不会支持这样做。设置绘制(Render,很多书上翻译成渲染,貌似很专业,但是不易懂,不敢苟同)线程的优先级。不像其他设置,同一进程中只需调用一次,默认值NORMAL。

  40. setSansSerifFontFamily (String font) 
    设置无衬线字体集(sans-serif font family)的名字。默认值”sans-serif”.

  41. setSaveFormData (boolean save) 
    WebView是否保存表单数据,默认值true。

  42. setSavePassword (boolean save) 
    API18以上版本已废弃。未来版本将不支持保存WebView中的密码。设置WebView是否保存密码,默认true。

  43. setSerifFontFamily (String font) 
    设置衬线字体集(serif font family)的名字,默认“sans-serif”。

  44. setStandardFontFamily (String font) 
    设置标准字体集的名字,默认值“sans-serif”。

  45. setSupportMultipleWindows (boolean support) 
    设置WebView是否支持多窗口。如果设置为true,主程序要实现onCreateWindow(WebView, boolean, boolean, Message),默认false。

  46. setSupportZoom (boolean support) 
    WebView是否支持使用屏幕上的缩放控件和手势进行缩放,默认值true。设置setBuiltInZoomControls(boolean)可以使用特殊的缩放机制。该项设置不会影响zoomIn() and zoomOut()的缩放操作。

  47. setTextSize (WebSettings.TextSize t) 
    API14版本以上已废弃。请取代使用setTextZoom(int)。设置页面文本的尺寸,默认NORMAL。

  48. setTextZoom (int textZoom) 
    设置页面上的文本缩放百分比,默认100。

  49. setUseWideViewPort (boolean use) 
    WebView是否支持HTML的“viewport”标签或者使用wide viewport。设置值为true时,布局的宽度总是与WebView控件上的设备无关像素(device-dependent pixels)宽度一致。当值为true且页面包含viewport标记,将使用标签指定的宽度。如果页面不包含标签或者标签没有提供宽度,那就使用wide viewport。

  50. setUserAgentString (String ua) 
    设置WebView的用户代理字符串。如果字符串为null或者empty,将使用系统默认值。注意从KITKAT版本开始,加载网页时改变用户代理会让WebView再次初始化加载。

  51. supportMultipleWindows () 
    获取WebView是否支持多窗口的值。

  52. supportZoom () 
    获取WebView是否支持缩放的值


0 0
原创粉丝点击