浏览器控件是每一个开发环境都具备的,这为马甲神功提供了用武之地,windows的有webbrowserandroidios都有webview。仅仅是其引擎不同,相对于微软的webbrowserandroidioswebview的引擎都是webkit,对Html5提供支持。本篇主要介绍androidwebview之强大。

A.webview组件怎样使用

1)加入�权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。

2)在要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"

/>

3)设置WebView基本信息:
假设訪问的页面中有Javascript,则webview必须设置支持Javascript
webview.getSettings().setJavaScriptEnabled(true);
触摸焦点起作用
requestFocus();
取消滚动栏
this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);

4)设置WevView要显示的网页:
互联网用:webView.loadUrl("http://www.google.com");
本地文件用:webView.loadUrl("file:///android_asset/XX.html");本地文件存放在:assets文件里

5)假设希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。给WebView加入�一个事件监听对象(WebViewClient)并重写当中的一些方法:
shouldOverrideUrlLoading:对网页中超链接button的响应。当按下某个连接时WebViewClient会调用这种方法,并传递參数:按下的url。比方当webview内嵌网页的某个数字被点击时,它会自己主动觉得这是一个电话请求,会传递urltel:123,假设你不希望如此可通过重写shouldOverrideUrlLoading函数解决:

 public boolean shouldOverrideUrlLoading(WebView view,String url){         if(url.indexOf("tel:")<0){//页面上有数字会导致连接电话             view.loadUrl(url);         }            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的页面,告诉用户程序在等待网络响应。

通过这几个事件,我们能够非常轻松的控制程序操作,一边用着浏览器显示内容,一边监控着用户操作实现我们须要的各种显示方式,同一时候能够防止用户产生误操作。

6)假设用webview点链接看了非常多页以后,假设不做不论什么处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,假设希望浏览的网页回退而不是退出浏览器,须要在当前Activity中处理并消费掉该Back事件。
覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。

 public boolean onKeyDown(int keyCoder,KeyEvent event){                         if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){                                  webview.goBack();   //goBack()表示返回webView的上一页面                                 return true;                          }                          return false;                 }


B.Webviewjs交互

Webviewjs的双向交互才是androidwebview强大所在,也是马甲精神可以彻底运行的基础保障。

首先,webview能够定义一个在其内嵌页面中能够触发的事件

 wv.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");private final class DemoJavaScriptInterface    {DemoJavaScriptInterface(){}     public void clickonAndroid( final String order){         mHandler.post(newRunnable(){             @Override             public void run(){                       jsonText="{"name":""+order+""}";                wv.loadUrl("javascript:wave("+jsonText+")");             }         });     }}

通过以上代码,就可以实如今其内嵌网页中触发window.demo.clickOnAndroid(str)事件并传參数strwebviewWebview接收到str之后,能够通过以上代码触发其内嵌页面中的js函数wave(str)。这样就能够实现网页触发webview的事件并传參数,webview接收參数并调用js函数。

以下看我的Html脚本:

<!DOCTYPEhtmlPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">

<title>Insert title here</title>

<scripttype="text/javascript"src="jquery.js"></script>

<script>

functiontoclient()

{

varorder=$("#val").val();

window.demo.clickonAndroid(order);

}

functionwave(str){

//alert(str.name);

$("#fromclient").text(str.name);

}

</script>

</head>

<body>这是一个html页面

<br/>

输入一个字符串:<br/>

<inputid="val"/>

<inputtype="submit"value="点击提交给client"

onclick="toclient();"/>

<br/>

显示返回:<labelid="fromclient"></label>

</body>

</html>

通过脚本看到wavestr)函数是负责将原来传给webview的数据又一次拿回页面,效果图例如以下:


另外,假设你想获取页面的一些处理数据并交给webviewclient处理,可在wave函数里将数据alert,然后webview中重写WebChromeClientonJsAlert函数,详细代码例如以下

wv.setWebChromeClient(new MyWebChromeClient());final  class MyWebChromeClient extends WebChromeClient{    @Override      public booleanonJsAlert(WebView view, String url, String message, final JsResult result) { //message就是wave函数里alert的字符串,这样你就能够在androidclient里对这个数据进行处理                result.confirm();                      }  return true;          }





更多相关文章

  1. android WebView总结
  2. android WebView总结
  3. android中四大组件之间相互通信
  4. Android测试之Monkey
  5. android WebView总结
  6. Android(安卓)触屏事件处理_手势识别
  7. Android中的日历读写操作!!!
  8. android WebView总结
  9. Linux/Android——input系统之 kernel层 与 frameworks层交互 (

随机推荐

  1. Flutter1.12与原生Android交互(kotlin)
  2. android开发 常用技巧
  3. android 源码导入到android studio
  4. 【译】Android 6.0接口变化(三)(Android 6.0
  5. android 系统属性 build.prop
  6. 2013.12.23 (2)——— android 代码调用she
  7. android获取手机号码以及imsi信息
  8. android按钮监听器的四种技术
  9. android网络图片的下载
  10. Android PinyinIME 源码笔记 -- 0. 简介