转自:http://blog.csdn.net/xiangjai/article/details/8306276
使用中遇到的问题:
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"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/hello"
/>
设置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())){ //已经处于底端 }