android之webview使用

转自: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);或者可以在activitylayout文件里添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())){ //已经处于底端 }

posted @ 2014-10-16 15:28  湖心北斗  阅读(247)  评论(0编辑  收藏  举报