您的位置:首页 > 移动开发

Android中WebView渲染显示web页面

2017-09-07 20:08 302 查看
最近在看web APP的开发,Android开发中经常会嵌入web页面,

h5 css3 javascript   通过WebView渲染的方式,性能损耗较大

今天看了一些关于WebView的资料,也动手敲了下,在此记录下。

WebView组件的功能

可以直接显示网页
可以显示本地html页面,通过html来布局
java和js之间可以交互
1、加载在线网页

在布局文件中加入WebView标签
接着通过java代码实现显示在线网页
webView=(WebView)findViewById(R.id.webview);
//        允许解析js
WebSettings settings=webView.getSettings();
settings.setJavaScriptEnabled(true);
//        优先使用缓存
settings.setCacheMode(settings.LOAD_CACHE_ELSE_NETWORK);
//        设置此属性,可任意比例缩放
settings.setUseWideViewPort(true);
//        适应webview
settings.setLoadWithOverviewMode(true);
//        设置可以支持缩放
settings.setSupportZoom(true);
//      设置出现缩放工具
settings.setBuiltInZoomControls(true);
//        手势焦点
webView.requestFocusFromTouch();
//      打开内置浏览器
WebViewClient webViewClient=new WebViewClient();
webView.setWebViewClient(webViewClient);
webView.loadUrl("http://www.baidu.com");


别忘了添加网络权限

2、显示本地html页面

在布局文件中加入WebView标签
在assets资源文件中新建一个html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<h1>Hello</h1>

</head>
<body>

</body>
</html>





加载html文件
webView.loadUrl("file:///android_asset/web.html");


3、java和js交互

js调用Java的方法
首先要新建一个类用于和js交互,类中的方法前要加入如下注解。
public class JsBrager {

@JavascriptInterface
public void toastMessage(String message) {
Toast.makeText(MyApplication.getContext(), "通过Natvie传递的Toast:" + message, Toast.LENGTH_LONG).show();
}


接着在主Activity中加入如下代码

webView.addJavascriptInterface(new JsBrager(),"demo");


这里面有两个参数,第一个为我们自定义类的对象,第二个参数为对象的别名,在js中通过这个别名来调用类中的方法。

然后在html文件中加入一个按钮,并添加事件。在事件方法中调用java中的方法。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<h1>Hello</h1>
<input type="button" value="js use java" onclick="ok()">
</head>
<body>
<script type="text/javascript">
function ok()
{
demo.toastMessage("hello");
}

</script>
</body>
</html>


java调用js
首先在html中加入一个方法

function sum(i,m)
{
var result = i+m;
}


然后在Activity中通过loadUrl方法来调用该方法

webView.loadUrl("javascript:sum(10,3)");


这里的javascript:是一个伪协议,sum(10,3)为js里的方法。

这样虽然调用了js中的方法,但是我想获得js返回的结果怎么办呢

public class JsBrager {

@JavascriptInterface
public void toastMessage(String message) {
Toast.makeText(MyApplication.getContext(), "通过Natvie传递的Toast:" + message, Toast.LENGTH_LONG).show();
}

@JavascriptInterface
public void onSumResult(int result) {
Log.i("------>", "onSumResult result=" + result);
}
}


这里有两种方法

第一种就是在js中法中再调用java中的方法

function sum(i,m)
{
var result = i+m;
demo.onSumResult(result);
}


第二种就是Android 4.4 以后的方法evaluateJavascript方法
js
function getGreetings()
{
return 1;
}


java
webView.evaluateJavascript("getGreetings()", new ValueCallback() {
@Override
public void onReceiveValue(Object o) {
Log.i("------>", "onReceiveValue value=" + o);
}

});


附录:WebView基本设置

/** 

 * 是否支持缩放,配合方法setBuiltInZoomControls使用,默认true 

 */  

setSupportZoom(boolean support)  

  

/** 

 * 是否需要用户手势来播放Media,默认true 

 */  

setMediaPlaybackRequiresUserGesture(boolean require)  

  

/** 

 * 是否使用WebView内置的缩放组件,由浮动在窗口上的缩放控制和手势缩放控制组成,默认false 

 */  

setBuiltInZoomControls(boolean enabled)  

  

/** 

 * 是否显示窗口悬浮的缩放控制,默认true 

 */  

setDisplayZoomControls(boolean enabled)  

  

/** 

 * 是否允许访问WebView内部文件,默认true 

 */  

setAllowFileAccess(boolean allow)  

  

/** 

 * 是否允许获取WebView的内容URL ,可以让WebView访问ContentPrivider存储的内容。 默认true 

 */  

setAllowContentAccess(boolean allow)  

  

/** 

 * 是否启动概述模式浏览界面,当页面宽度超过WebView显示宽度时,缩小页面适应WebView。默认false 

 */  

setLoadWithOverviewMode(boolean overview)  

  

/** 

 * 是否保存表单数据,默认false 

 */  

setSaveFormData(boolean save)  

  

/** 

 * 设置页面文字缩放百分比,默认100% 

 */  

setTextZoom(int textZoom)  

  

/** 

 * 是否支持ViewPort的meta tag属性,如果页面有ViewPort meta tag 指定的宽度,则使用meta tag指定的值,否则默认使用宽屏的视图窗口 

 */  

setUseWideViewPort(boolean use)  

  

  

/** 

 * 是否支持多窗口,如果设置为true ,WebChromeClient#onCreateWindow方法必须被主程序实现,默认false 

 */  

setSupportMultipleWindows(boolean support)  

  

/** 

 * 指定WebView的页面布局显示形式,调用该方法会引起页面重绘。默认LayoutAlgorithm#NARROW_COLUMNS 

 */  

setLayoutAlgorithm(LayoutAlgorithm l)  

  

/** 

 * 设置标准的字体族,默认”sans-serif”。font-family 规定元素的字体系列。 

 * font-family 可以把多个字体名称作为一个“回退”系统来保存。如果浏览器不支持第一个字体, 

 * 则会尝试下一个。也就是说,font-family 属性的值是用于某个元素的字体族名称或/及类族名称的一个 

 * 优先表。浏览器会使用它可识别的第一个值。 

 */  

setStandardFontFamily(String font)  

  

/** 

 * 设置混合字体族。默认”monospace” 

 */  

setFixedFontFamily(String font)  

  

/** 

 * 设置SansSerif字体族。默认”sans-serif” 

 */  

setSansSerifFontFamily(String font)  

  

/** 

 * 设置SerifFont字体族,默认”sans-serif” 

 */  

setSerifFontFamily(String font)  

  

/** 

 * 设置CursiveFont字体族,默认”cursive” 

 */  

setCursiveFontFamily(String font)  

  

/** 

 * 设置FantasyFont字体族,默认”fantasy” 

 */  

setFantasyFontFamily(String font)  

  

/** 

 * 设置最小字体,默认8. 取值区间[1-72],超过范围,使用其上限值。 

 */  

setMinimumFontSize(int size)  

  

/** 

 * 设置最小逻辑字体,默认8. 取值区间[1-72],超过范围,使用其上限值。 

 */  

setMinimumLogicalFontSize(int size)  

  

/** 

 * 设置默认字体大小,默认16,取值区间[1-72],超过范围,使用其上限值。 

 */  

setDefaultFontSize(int size)  

  

/** 

 * 设置默认填充字体大小,默认16,取值区间[1-72],超过范围,使用其上限值。 

 */  

setDefaultFixedFontSize(int size)  

  

/** 

 * 设置是否加载图片资源,注意:方法控制所有的资源图片显示,包括嵌入的本地图片资源。 

 * 使用方法setBlockNetworkImage则只限制网络资源图片的显示。值设置为true后, 

 * webview会自动加载网络图片。默认true 

 */  

setLoadsImagesAutomatically(boolean flag)  

  

/** 

 * 是否加载网络图片资源。注意如果getLoadsImagesAutomatically返回false,则该方法没有效果。 

 * 如果使用setBlockNetworkLoads设置为false,该方法设置为false,也不会显示网络图片。 

 * 当值从true改为false时。WebView会自动加载网络图片。 

 */  

setBlockNetworkImage(boolean flag)  

  

/** 

 * 设置是否加载网络资源。注意如果值从true切换为false后,WebView不会自动加载, 

 * 除非调用WebView#reload().如果没有android.Manifest.permission#INTERNET权限, 

 * 值设为false,则会抛出java.lang.SecurityException异常。 

 * 默认值:有android.Manifest.permission#INTERNET权限时为false,其他为true。 

 */  

setBlockNetworkLoads(boolean flag)  

  

/** 

 * 设置是否允许执行JS。 

 */  

setJavaScriptEnabled(boolean flag)  

  

/** 

 * 是否允许Js访问任何来源的内容。包括访问file scheme的URLs。考虑到安全性, 

 * 限制Js访问范围默认禁用。注意:该方法只影响file scheme类型的资源,其他类型资源如图片类型的, 

 * 不会受到影响。ICE_CREAM_SANDWICH_MR1版本以及以下默认为true,JELLY_BEAN版本 

 * 以上默认为false 

 */  

setAllowUniversalAccessFromFileURLs(boolean flag)  

  

  

/** 

 * 是否允许Js访问其他file scheme的URLs。包括访问file scheme的资源。考虑到安全性, 

 * 限制Js访问范围默认禁用。注意:该方法只影响file scheme类型的资源,其他类型资源如图片类型的, 

 * 不会受到影响。如果getAllowUniversalAccessFromFileURLs为true,则该方法被忽略。 

 * ICE_CREAM_SANDWICH_MR1版本以及以下默认为true,JELLY_BEAN版本以上默认为false 

 */  

setAllowFileAccessFromFileURLs(boolean flag)  

  

/** 

 * 设置存储定位数据库的位置,考虑到位置权限和持久化Cache缓存,Application需要拥有指定路径的 

 * write权限 

 */  

setGeolocationDatabasePath(String databasePath)  

  

/** 

 * 是否允许Cache,默认false。考虑需要存储缓存,应该为缓存指定存储路径setAppCachePath 

 */  

setAppCacheEnabled(boolean flag)  

  

/** 

 * 设置Cache API缓存路径。为了保证可以访问Cache,Application需要拥有指定路径的write权限。 

 * 该方法应该只调用一次,多次调用自动忽略。 

 */  

setAppCachePath(String appCachePath)  

  

/** 

 * 是否允许数据库存储。默认false。查看setDatabasePath API 如何正确设置数据库存储。 

 * 该设置拥有全局特性,同一进程所有WebView实例共用同一配置。注意:保证在同一进程的任一WebView 

 * 加载页面之前修改该属性,因为在这之后设置WebView可能会忽略该配置 

 */  

setDatabaseEnabled(boolean flag)  

  

/** 

 * 是否存储页面DOM结构,默认false。 

 */  

setDomStorageEnabled(boolean flag)  

  

/** 

 * 是否允许定位,默认true。注意:为了保证定位可以使用,要保证以下几点: 

 * Application 需要有android.Manifest.permission#ACCESS_COARSE_LOCATION的权限 

 * Application 需要实现WebChromeClient#onGeolocationPermissionsShowPrompt的回调, 

 * 接收Js定位请求访问地理位置的通知 

 */  

setGeolocationEnabled(boolean flag)  

  

/** 

 * 是否允许JS自动打开窗口。默认false 

 */  

setJavaScriptCanOpenWindowsAutomatically(boolean flag)  

  

/** 

 * 设置页面的编码格式,默认UTF-8 

 */  

setDefaultTextEncodingName(String encoding)  

  

/** 

 * 设置WebView代理,默认使用默认值 

 */  

setUserAgentString(String ua)  

  

/** 

 * 通知WebView是否需要设置一个节点获取焦点当 

 * WebView#requestFocus(int,android.graphics.Rect)被调用的时候,默认true 

 */  

setNeedInitialFocus(boolean flag)  

  

/** 

 * 基于WebView导航的类型使用缓存:正常页面加载会加载缓存并按需判断内容是否需要重新验证。 

 * 如果是页面返回,页面内容不会重新加载,直接从缓存中恢复。setCacheMode允许客户端根据指定的模式来 

 * 使用缓存。 

 * LOAD_DEFAULT 默认加载方式 

 * LOAD_CACHE_ELSE_NETWORK 按网络情况使用缓存 

 * LOAD_NO_CACHE 不使用缓存 

 * LOAD_CACHE_ONLY 只使用缓存 

 */  

setCacheMode(int mode)  

  

/** 

 * 设置加载不安全资源的WebView加载行为。KITKAT版本以及以下默认为MIXED_CONTENT_ALWAYS_ALLOW方 

 * 式,LOLLIPOP默认MIXED_CONTENT_NEVER_ALLOW。强烈建议:使用MIXED_CONTENT_NEVER_ALLOW 

 */  

setMixedContentMode(int mode)
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: