首页 > 其他分享 >Android开发--WebView, WebChromeClient和WebViewClient

Android开发--WebView, WebChromeClient和WebViewClient

时间:2023-05-05 23:09:12浏览次数:37  
标签:-- webview mWebView public WebViewClient new WebView webView WebChromeClient


 

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);
     }
	
}

 

 

标签:--,webview,mWebView,public,WebViewClient,new,WebView,webView,WebChromeClient
From: https://blog.51cto.com/iwtxokhtd/6247997

相关文章

  • Android开发--事件绑定及startActivity、startActivityForResult区别
      一、绑定事件的方法:1、方法一:UI组件事件属性调用main.xml:<Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="forWard"an......
  • 16QAM调制解调系统相位盲估计matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要16QAM是指包含16种符号的QAM调制方式。16QAM是用两路独立的正交4ASK信号叠加而成,4ASK是用多电平信号去键控载波而得到的信号。它是2ASK调制的推广,和2ASK相比,这种调制的优点在于信息传输速率高。正交幅度......
  • Android开发--架构详解
    Android体系架构详解:http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/#ibm-pcon    src文件夹是项目的所有包及源文件(.java)(与一般的Java项目一样)分析HelloAndroid项目的主程序文件HelloAndroid.java,如代码清单3-8所示。代码清单3-8HelloAndroid.java......
  • 网页抓取--1(原网页+Javascript返回数据)
     有时候由于种种原因,我们需要采集某个网站的数据,但由于不同网站对数据的显示方式略有不同!本文就用Java给大家演示如何抓取网站的数据:(1)抓取原网页数据;(2)抓取网页Javascript返回的数据。一、抓取原网页。这个例子我们准备从http://ip.chinaz.com上抓取ip查询的结果:第一步:打开这个网页......
  • 前端技能汇总
    项目起源前端知识结构图(@jayli)。前端开发知识结构前端工程师浏览器IE6/7/8/9FirefoxChrome/Safari/Opera编程语言JavaScript/Node.jsJavaScript语言精粹切页面HTMLCSSPhotoShop/Paint.net开发工具IDEVIM/SublimeText2Notepad++/EditPlus调......
  • 大型网站架构演变和知识体系
    之前也有一些介绍大型网站架构演变的文章,例如LiveJournal的、ebay的,都是非常值得参考的,不过感觉他们讲的更多的是每次演变的结果,而没有很详细的讲为什么需要做这样的演变,再加上近来感觉有不少同学都很难明白为什么一个网站需要那么复杂的技术,于是有了写这篇文章的想法。在这篇文章......
  • 微信公众平台开发——如何保证access_token长期有效?
    【编者按】由CSDN和《程序员》杂志联合主办的 2014年微信开发者大会将于8月23日在北京举行。内容涵盖企业服务号开发和高级应用、企业号开发、业务系统对接、高级接口运用、微信支付、智能客服与LBS、HTML5社交应用、微信电商、微信广告自助平台等多方面。作为一线微信开发商云......
  • Java中快如闪电的线程间通讯
    这个故事源自一个很简单的想法:创建一个对开发人员友好的、简单轻量的线程间通讯框架,完全不用锁、同步器、信号量、等待和通知,在Java里开发一个轻量、无锁的线程内通讯框架;并且也没有队列、消息、事件或任何其他并发专用的术语或工具。只用普通的老式Java接口实现POJO的通讯。它可能......
  • 5个强大的Java分布式缓存框架推荐
    本文主要是分享了5个常用的Java分布式缓存框架,这些缓存框架支持多台服务器的缓存读写功能,可以让你的缓存系统更容易扩展。1、EhcacheEhcache是一个Java实现的开源分布式缓存框架,EhCache可以有效地减轻数据库的负载,可以让数据保存在不同服务器的内存中,在需要数据的时候可以快速存取......
  • JDK----下载、作用、安装、配置
      官网JDK下载地址http://www.oracle.com/technetwork/java/javase/downloads/index.html   JDK介绍:java开发、调试需要安装JDK(包括javac编译、JRE等)只运行java程序只需安装JRE(包括javaAPI类库和JVM虚拟机)JRE  JDK环境变量配置及作用:安装完JDK后在cmd中输入java报错“不是内......