zoukankan      html  css  js  c++  java
  • 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())){ //已经处于底端 }

  • 相关阅读:
    no-useless-call (Rules) – Eslint 中文开发手册
    Java 8 Stream
    CSS3 ,checked 选择器
    MySQL 数据类型
    _Alignas (C keywords) – C 中文开发手册
    C 库函数 – modf()
    JavaScript E 属性
    SyntaxError.prototype (Errors) – JavaScript 中文开发手册
    swagger和openAPI: 上传文件
    Java中HashMap的putAll()方法: HashMap.putAll()
  • 原文地址:https://www.cnblogs.com/jackwuyongxing/p/4028925.html
Copyright © 2011-2022 走看看