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())){ //已经处于底端 }

你可能感兴趣的:(android)