WebView使用
使用中遇到的问题:
1、解决webview缓存: WebSettings.LOAD_NO_CACHE 或者直接清除缓存
2、解决webview无法弹出alert: WebChromeClient中重写onJsAlert方法3、解决webview获取网页内容“: addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj")
webview组件如何使用:
添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。
在要Activity中生成一个WebView组件:WebView webView = new WebView(this);或者可以在activity的layout文件里添加webview控件:
<WebView
android:id="@+id/wv"
设置WebView基本信息
/**
* 显示WebView
*/
public void showWebView(String url){
webview.getSettings().setJavaScriptEnabled(true); // 设置页面支持Javascript
webview.getSettings().setLoadWithOverviewMode(true);
webview.getSettings().setSupportZoom(true); //支持缩放
webview.getSettings().setBuiltInZoomControls(true); //显示放大缩小
webview.setInitialScale(130); //初始化时缩放
webview.getSettings().setDefaultTextEncodingName("utf-8");
webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);//解决缓存问题
webview.loadUrl(url);
webview.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");//获取网页内容
webview.setWebViewClient(new MyWebViewClient());
webview.setWebChromeClient(new HellowebViewClient());
}
final class InJavaScriptLocalObj { //获取网页内容
public void showSource(String html) {
// Log.d("HTML", html);
if((html != null && html.contains("重新登录")) || (html != null && html.contains("nologin.jsp"))) {
Log.d("TAG", "重新登录");
Toast.makeText(getApplicationContext(), "获取信息失败,请重新访问", 0).show();
}
}
}
/**
* 解决webview中当开启新的页面的时候用webview来进行处理而不是用系统自带的浏览器处理
*
* 载入页面完成的事件,获取网页内容
* @author Administrator
*
*/
private class MyWebViewClient extends WebViewClient {
/**
* 如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。
* 给WebView添加一个事件监听对象(WebViewClient)并重写其中的一些方法:
* shouldOverrideUrlLoading:对网页中超链接按钮的响应。当按下某个连接时
* WebViewClient会调用这个方法,并传递参数:按下的url。比如当webview内嵌
* 网页的某个数字被点击时,它会自动认为这是一个电话请求,会传递url:tel:123,
* 如果你不希望如此可通过重写shouldOverrideUrlLoading函数解决
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 当开启新的页面的时候用webview来进行处理而不是用系统自带的浏览器处理
// 互联网用:webView.loadUrl("http://www.google.com");
// 本地文件用:webView.loadUrl("file:///android_asset/XX.html"); 本地文件存放
view.loadUrl(url);
return true;
}
/**
*载入页面完成的事件
**/
@Override
public void onPageFinished(WebView view, String url) {
//获取网页内容
view.loadUrl("javascript:window.local_obj.showSource" +
"('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
super.onPageFinished(view, url);
}
}
/***************************************************/
/**
* 解决webview中无法弹出alert的问题
*/
private class HellowebViewClient extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message,
final JsResult result) {
AlertDialog.Builder b2 = new AlertDialog.Builder(Test.this)
.setTitle("提示:").setMessage(message)
.setPositiveButton("ok",
new AlertDialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
result.confirm();
}
});
b2.setCancelable(false);
b2.create();
b2.show();
return true;
}
}
/*
1,接收到Http请求的事件
onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)
2,打开链接前的事件
public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; }
这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。
3,载入页面完成的事件
public void onPageFinished(WebView view, String url){ }
同样道理,我们知道一个页面载入完成,于是我们可以关闭loading条,切换程序动作。
4,载入页面开始的事件
public void onPageStarted(WebView view, String url, Bitmap favicon) { }
这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。
*/
WebView cookies清理:
CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().startSync();
CookieManager.getInstance().removeSessionCookie();
另外,清理cache 和历史记录的方法:
WebView.clearCache(true);
WebView.clearHistory();
Android判断WebView是否已经滚动到页面底端:
getScrollY()方法返回的是当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离.getHeight()或者getBottom()方法都返回当前WebView 这个容器的高度
getContentHeight 返回的是整个html 的高度,但并不等同于当前整个页面的高度,因为WebView 有缩放功能, 所以当前整个页面的高度实际上应该是原始html 的高度再乘上缩放比例. 因此,更正后的结果,准确的判断方法应该是:
if(WebView.getContentHeight*WebView.getScale() == (webview.getHeight()+WebView.getScrollY())){ //已经处于底端 }