1 WebView最简单的使用,加载一个url路径,代码如下:
wv_all = (WebView) findViewById(R.id.wv_all);
// 重新设置websettings ,否则有可能加载不出来页面,或者加载出来的页面不完整的问题
WebSettings s = wv_all.getSettings();
s.setBuiltInZoomControls(true);
s.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
s.setUseWideViewPort(true);
s.setLoadWithOverviewMode(true);
s.setSavePassword(true);
s.setSaveFormData(true);
s.setJavaScriptEnabled(true);
// enable navigator.geolocation
s.setGeolocationEnabled(true);
s.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/");
wv_all.loadUrl(UrlContansts.Find_YingShiJu_All+"?userid="+XingZhiApplication.getInstance().userid+"&type=电视剧");
通常我们会为webview注册一个监听,监听其变化的过程,如下:
wv_all.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//webview加载完成后所调用的回调方法
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
super.onPageStarted(view, url, favicon);
//webview加载开始时所调用的回调方法
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 监听所有点击的链接,如果拦截到我们需要的,就跳转到相对应的页面。
if (url != null && url.contains("MoviesInfo")) {
Intent intent = new Intent(mContext, FindPingLunActivity.class);
intent.putExtra("url", url);
intent.putExtra("flag", "0");
mContext.startActivity(intent);
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
});
2 如果服务器接口返回的不是一个完成的url路径,而是一个完整的html代码(即包含html标签,body标签等),处理方式如下:
在请求服务器接口成功的回调方法中加上下面的代码:
try {
FileWriter fw = new FileWriter("sdcard/test8.htm");//保存到sd卡上,且名字为test8.htm,后缀名必须为htm
fw.append(arg0.result);
fw.flush();
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
wv_web.loadUrl("file://"+"/mnt/sdcard/"+"test8.htm");//通过loadUrl加载sd卡上的text8.htm,除了htm名是变化的,前面都是固定的格式,否则你会找不到htm而显示不出来
如果确定上面的代码没有用错,还是没有加载出来,那么就在初始化webview的地方加上下面的监听:
//设置下面的属性,就是为了加载服务器返回的htm5页面
wv_web.setWebViewClient(new WebViewClient());
3 如果服务器返回的是包含有如
,< >等html格式的字符串,但不是完整的html代码时,处理方式有如下两个方式:
3.1
wv.setVerticalScrollBarEnabled(false);
wv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
wv.setScrollContainer(false);
wv.setScrollbarFadingEnabled(false);
wv.getSettings().setUseWideViewPort(true);
wv.setBackgroundColor(0); // 设置背景色,注意要在xml布局文件中对webview设置background,否则程序运行会崩溃。
wv.getBackground().setAlpha(0); // 设置填充透明度 范围:0-255
wv.getSettings().setDefaultTextEncodingName("UTF-8");
WebSettings ws = wv.getSettings();
ws.setDefaultFontSize(15);//设置webview上字体的大小。很可惜没有设置字体颜色的方法。
wv.loadDataWithBaseURL(null,"", "text/html","utf-8", null);
通过上面的loadDataWithBaseURL方法就加载成功了。其中aboutUs.Data.get(0)._introduction就是接口所返回的包含有一些html标签的字符串。之所以在字符串的外面加了
3.2 第二个方法处理起来非常的简单,不用webview,而是用textview,一句话就搞定了,远远的比第一个方法简便的多了 tv_name_content.setText(Html.fromHtml(aboutUs.Data.get(0)._introduction)); 其中tv_name_content就是xml布局中定义的一个控件(不用定义webview了哦),然后将接口返回的数据通过方法Html.fromHtml()直接就显示在手机上,而且是有标签对应的格式的。很是完美。 4 最后说一下Android和javascript的交互问题 4.1 js调用android中的方法,实例如下: webview.addJavaScriptInterface(new object(){ public void showToast(String content){ System.out.println("交互后得到的js传递过来的数据为:"+content); } },"android"); 解释:这里有两个地方是相对变化的, 第一:双引号中的android,其只是一个标识,用于被h5所识别,可以随便写。但是你写成什么,那么必须告诉h5,因为h5必须用该标识调用另外一个可以变化的地方:showToast方法 第二:第一步中说到的showToast方法也是可以随便写的,写好之后告诉h5,他们会调用这个方法的,而方法中的参数就是你们二者之间数据传递的桥梁,交互的重点就是拿到这个参数数据。 4.2 android中调用js,实例: webview.loadUrl("javascript:changeInputValue('hellow 世界')"); 其中重点是格式必须是:javascript:且小写。然后changeInputValue('hellow 世界')是h5中写好的方法,参数hellow 世界 是我们要传递的参数,这样我们就把数据:hellow 世界 传递给了js,即完成了android中调用js的交互。