`
2277259257
  • 浏览: 498325 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Android开发--WebView, WebChromeClient和WebViewClient

 
阅读更多

 

WebView 是Android APP用来处理html页面的一个组件

webview是android中的浏览器控件,在一些手机应用中常会用到b/s模式去开发应用,这时webview的强大功能就会显示出来。

webview的几点设置

      权限设置:.AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误

  js开放设置: 如果访问的页面中有Javascript,则webview必须设置支持Javascript。webview.getSettings().setJavaScriptEnabled(true); 否则,页面的js将不会起作用.

  滚动条设置:this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);

  设置缓存模式:setCacheMode

 

    webView.getSettings().setJavaScriptEnabled(true);
  webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
  webView.setHorizontalScrollBarEnabled(false);
  webView.getSettings().setSupportZoom(true);
  webView.getSettings().setBuiltInZoomControls(true);
  webView.setInitialScale(70);
  webView.setHorizontalScrollbarOverlay(true);
 WebView主要完成解析、渲染界面。其他交给事件监听对象(WebViewClient)处理各种通知、请求事件;WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等

 

 

 

WebViewClient主要帮助WebView处理各种通知、请求事件的,比如:

shouldOverrideUrlLoading:在web页面里单击链接的时候,会自动调用android自带的浏览器来打开链接,需要通过该方法在本页面打开;
onLoadResource:加载资源时响应
onPageStart:在加载页面时响应
onPageFinish:在加载页面结束时响应
onReceiveError:在加载出错时响应
onReceivedHttpAuthRequest:

如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象。
    mWebView.setWebViewClient(new WebViewClient(){       
          public boolean shouldOverrideUrlLoading(WebView view, String url){       
                   view.loadUrl(url);       
                   return true;       
          }       
     }); 

 

 

WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等比如:

onCloseWindow(关闭WebView)
onCreateWindow()
onJsAlert (WebView上alert无效,需要定制WebChromeClient处理弹出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle

 

返回处理

如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。

 public boolean onKeyDown(int keyCode, KeyEvent event) {       
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {       
            mWebView.goBack();       
            return true;       
        }       
        return super.onKeyDown(keyCode, event);       
    }

 

支持javascripte自定义对象0

 

可以通过addJavascriptInterface()方法,添加js自定义对象,使用web页面与手机java程序能够进行通信交互

在w3c标准中js有 window,history,document等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使用js就可以为所欲为了

public class WebViewDemo extends Activity {        
             private WebView mWebView;       
             private Handler mHandler = new Handler();       
       
            public void onCreate(Bundle icicle) {       
                     super.onCreate(icicle);       
                     setContentView(R.layout.webviewdemo);       
                     mWebView = (WebView) findViewById(R.id.webview);       
                     WebSettings webSettings = mWebView.getSettings();       
                     webSettings.setJavaScriptEnabled(true);       
                     mWebView.addJavascriptInterface(new Object() {       
                          public void clickOnAndroid() {       
                                mHandler.post(new Runnable() {       
                                     public void run() {       
                                         mWebView.loadUrl("javascript:wave()");
                                     }       
                                 });       
                              }       
                     }, "demo");       
                     mWebView.loadUrl("file:///android_asset/demo.html");       
            }       
     }

 我们看addJavascriptInterface(Object obj,String interfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName(demo),作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 javascript:window.demo访问到绑定的java对象了。来看看在html中是怎样调用的。

<html>       
     <mce:script language="javascript"><!--     
       
         function wave() {       
            document.getElementById("droid").src="android_waving.png";       
         }       
             
// --></mce:script>       
     <body>       
          <a onClick="window.demo.clickOnAndroid()">       
             <img id="droid" src="android_normal.png" mce_src="android_normal.png"/>
                Click me!       
          </a>       
     </body>       
</html>     

 这样在javascript中就可以调用java对象的clickOnAndroid()方法了,同样我们可以在此对象中定义很多方法(比 如发短信,调用联系人列表等手机系统功能。),这里wave()方法是java中调用javascript的例子。

 

DownloadListener接口

该接口里面有一个方法,onDownloadStart()下载侦听接口,如果客户代码实现该接口,则在下载开始、失败、挂起、完成等情况下,DownloadManagerCore对象会调用客户代码中实现的DownloadListener方法。

 

这里还有几个知识点:

1)为了让WebView从apk文件中加载assets,Android SDK提供了一个schema,前缀为"file:///android_asset/"。WebView遇到这样的schema,就去当前包中的 assets目录中找内容。如上面的"file:///android_asset/demo.html" 

2)addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用 Handler的目的(今天我是在没有在handler中处理,所以导致webviewclient中的onPageStart方法与addJavascriptInterface中的方法起了冲突,二个人的执行顺序时常互换,之后改成handlder实现,就解决其中的问题,正确的顺序是onPageStart在addJavascriptInterface中的handlder事件处理之前执行)。

 

看上去他们有很多不同,实际使用的话,如果你的WebView只是用来处理一些html的页面内容,只用WebViewClient就行了,如果需要更丰富的处理效果,比如JS、进度条等,就要用到WebChromeClient。

更多的时候,你可以这样

WebView webView= (WebView) findViewById(R.id.webview);

webView.setWebChromeClient(new WebChromeClient());

webView.setWebViewClient(new WebViewClient());

webView.getSettings().setJavaScriptEnabled(true);   //WebView对JS的支持

webView.loadUrl(url);

这样你的WebView理论上就能有大部分需要实现的特色了

当然,有些更精彩的内容还是需要你自己添加的

 

 

实例:

activity_web.xml:

<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webView1" 
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

 

WebActivity.java:

 

public class WebActivity extends Activity {
	
    private static final String LOG_TAG = "WebViewDemo";  
    private WebView mWebView;  
    private Handler mHandler = new Handler(); 
    final Activity activity = this;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_web);

	mWebView = (WebView) findViewById(R.id.webView1);
		
	/**
	* webView的渲染:WebViewClient处理html
	*/
	mWebView.setWebViewClient(new WebViewClient() {
		//覆盖 WebViewClient对象shouldOverrideUrlLoading方法
                  (目的:使请求的html页面在webView中渲染,而不是Android系统的browser中)
		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			view.loadUrl(url);
			return true;
		}

		//通知事件
		public void onReceivedError(WebView view, int errorCode,
                                            String description, String failingUrl) { 
			// Handle the error
                  Toast.makeText(getApplicationContext(),"网络连接失败 ,请连接网络。",                                                  Toast.LENGTH_SHORT).show();
                }
	});
		
		
	/**
	* webView的渲染:WebChromeClient辅助WebView处理Javascript的对话框,加载进度
	*/
	mWebView.setWebChromeClient(new MyWebChromeClient());
		
		
	/**
	* webView的渲染:webview对js自定义对象的支持
	* (在w3c标准中js有 window,history,document等标准对象,
	* 同样我们可以在开发浏览器时自定义我们的对象调用手机系统功能来处理)
	*/
	WebSettings webSettings = mWebView.getSettings();
	webSettings.setJavaScriptEnabled(true);
	webSettings.setSavePassword(false);
	webSettings.setSaveFormData(false);
	webSettings.setSupportZoom(false);
	/**webView的渲染:webview对js自定义对象的支持,写法一*/
//	mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");

	/**webView的渲染:webview对js自定义对象的支持,写法二:*/
	mWebView.addJavascriptInterface(new Object() {       
            public void clickOnAndroid() {       
              mHandler.post(new Runnable() {       
                public void run() {                                                
                 mWebView.loadUrl("javascript:wave()");//加载html文件中的JS方法wave()                      }       
              });       
            }       
        }, "demo");     
		
		
		
	mWebView.loadUrl("http://192.168.1.228:8080/ytj/index.html");
//	mWebView.loadUrl("http://183.129.157.219:8086/ytj/index.html");
//	mWebView.loadUrl("http://www.etongjin.com.cn/index.html");
   }
	

		
    /*
     * WebChromeClient辅助WebView处理类
     */
    final class MyWebChromeClient extends WebChromeClient {
	@Override
	//WebChromeClient处理Javascript的对话框
          (WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出)
	public boolean onJsAlert(WebView view, String url,
                                 String message,JsResult result){
		Log.d(LOG_TAG, message);
		result.confirm();
		return true;
	}
		
	//WebChromeClient处理进度条
	public void onProgressChanged(WebView view, int progress) {
		activity.setTitle("Loading...");
		activity.setProgress(progress * 100);
		if (progress == 100)
			activity.setTitle(R.string.app_name);
	}    
    }
	
	
    /*
     * webView的渲染:webview对js自定义对象的支持,写法一
     */
    final class DemoJavaScriptInterface {
	DemoJavaScriptInterface() { }
	public void clickOnAndroid() {
		mHandler.post(new Runnable() {
		   public void run() {
		      mWebView.loadUrl("javascript:wave()");//加载html文件中的JS方法wave() 
		   }
		});
	}
    }
	
	
    /**
     * webView渲染页面的回退(非退出):
     * 如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身;
     * 如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件
     */
     public boolean onKeyDown(int keyCode, KeyEvent event) {
	if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
		mWebView.goBack();
		return true;
	}
	return super.onKeyDown(keyCode, event);
     }
	
}	
 

 

 

分享到:
评论

相关推荐

    android WebViewClient与WebChromeClient用法

    WebViewClient与WebChromeClient的用法和比较

    Android代码-Andorid-LiteHybrid-WebView

    1. 封装原生 webview,使用 WebViewClient 与 WebChromeClient 2. H5 调用 Native 采用 js prompt 方式 3. Native 调用 H5 采用 loadurl API 使用说明: errorview 和 loadingview 可以自定义 对 WebView 设置...

    Android中WebChromeClient和WebViewClient的区别浅析

    1、WebViewClient就是帮助WebView处理各种通知、请求事件的,具体来说包括:onLoadResource 、onPageStart 、onPageFinish 、onReceiveError 、onReceivedHttpAuthRequest 2、WebChromeClient是辅助WebView处理...

    Android中WebView的具体实现

    Android中使用WebView, WebChromeClient和WebViewClient加载网页的具体实现过程。

    android WebView

    一个Android Webview使用例子,介绍WebSetting 、WebViewClient、WebChromeClient

    Android WebView实例

    WebView的实现,主要使用到了WebViewClient和WebChromeClient两个类。

    Android4.4 WebView使用实例,实现后退前进刷新错误处理等功能

    Android 4.4 WebView使用实例,实现后退、前进、刷新、错误处理等功能。完成项目,可直接eclipse运行。有WebViewClient常用方法注释,WebChromeClient常用方法注释。

    webview 上传照片

    功能是android webview 嵌入HTML5的页面,页面中有一个标签,iOS直接就支持,但android中不支持,网上的帖子说是因为android屏蔽了文件上传功能还是怎么的,没看明白,但是重写WebViewClient,WebChromeClient这两个...

    android在线查看pdf文档

    pdfShowWebView = (WebView) findViewById(R.id.pdf_show_webview); pdfShowWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) {...

    TestJsInteraction:android 原生webview与js交互方式说明

    android 原生webview与js交互 具体也可见个人简书(图文说明更加详细): 前言 Android与JS通过WebView互相调用方法,实际上是: 1、Android去调用JS的代码 2、JS去调用Android的代码 二者沟通的桥梁是WebView 对于...

    Android JS通信示例源码

    通过 ​​WebViewClient​​​ 的​​shouldOverrideUrlLoading ()​​方法回调拦截 url,不存在1的漏洞,但JS获取Android方法的返回值复杂 通过 ​​WebChromeClient​​​ 的​​onJsAlert()​​​、​​...

    shareSDK分享

    1、参考”安卓快速集成文档“章节的说明,导入ShareSDK for Android的jar库和图片、文字资源。 2、复制github上的jsdemo项目中”cn.sharesdk.js”包中的源代码复制到你的项目中。QQ截图20150304142013 3、在您...

    WebViewInjector

    一个 Android WebViewClient ,它允许您将自己的 JavaScript 注入客户端的WebViews 。 开始将您拥有的任何脚本放在assets/ &lt;dir&gt; / &lt;filename&gt; 例如 assets/scripts/my_script.js 有一个启用了 JavaScript 的 ...

Global site tag (gtag.js) - Google Analytics