WebView

在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件.

使用

1代码或xml创建webview对象
2调用WebView的loadUrl()方法,加载WevView要显示的网页
互联网用:webView.loadUrl(“http://www.google.com“);
本地文件用:webView.loadUrl(“file:///android_asset/XX.html”); 本地文件存放在:assets 文件中
3调用Activity的setContentView( )
参考代码

public class MiniBrowser extends Activity {
    WebView show;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //获取页面WebView组件
        show = (WebView) findViewById(R.id.show);
        //加载需要显示的网页
        show.loadUrl("http://www.51cto.com/");
        //设置Web视图,webview里点击链接时默认使用浏览器打开的
        //如果希望点击链接继续在当前中响应,而不是浏览器响应该链接,必须覆盖webview的WebViewClient对象
        show.setWebViewClient(new HelloWebViewClient());
    }
    @Override
    //设置回退
    //用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && show.canGoBack()) {
            show.goBack(); //goBack()表示返回WebView的上一页面
            return true;
        }
        return false;
    }
    //Web视图,WebViewClient就是帮助WebView处理各种通知、请求事件的
    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);//WebView加载网页
            return true;
        }
    }
}

WebView在开发总结

1.AndroidManifest.xml中必须使用许可”android.permission.INTERNET”,否则会出Webpage not available错误。
2.如果访问的页面中有Javascript,则webview必须设置支持Javascript。

    WebSettings webSetting = webview.getSettings();
    webSetting.setJavaScriptEnabled(true);  

3.如果页面中链接,如果希望点击链接继续在当前中响应,而不是浏览器响应该链接,必须覆盖webview的WebViewClient对象。

   mWebView.setWebViewClient(new WebViewClient(){      
           publicboolean shouldOverrideUrlLoading(WebView view, String url) {      
                            view.loadUrl(url);      
                            returntrue;      
            }      
    }); 

4.如果不做任何处理,浏览网页,点击系统“Back”键,会调用finish()而结束自身,如果希望浏览的网页回退而不是退出,需要在当前Activity中 重写onKeyDown。

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

5如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点。

webview.requestFocusFromTouch();

6.WebView 加载界面主要调用三个方法:LoadUrl、LoadData、LoadDataWithBaseURL.
 1、LoadUrl 直接加载网页、图片并显示.(本地或是网络上的网页、图片、gif)
 2、LoadData 显示文字与图片内容(模拟器1.5、1.6)
 3、LoadDataWithBase 显示文字与图片内容(支持多个模拟器版本)
7 WebView默认没有开启文件下载的功能,如果要实现文件下载的功能,需要设置WebView的DownloadListener,通过实现自己的DownloadListener来实现文件的下载。具体操作如下:
1、设置WebView的DownloadListe
webView.setDownloadListener(new MyWebViewDownLoadListener());
2、实现MyWebViewDownLoadListener这个类:

private class MyWebViewDownLoadListener implements DownloadListener {  
    @Override  
    public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype,  
long contentLength) {  
        Uri uri = Uri.parse(url);  
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
        startActivity(intent);  
    }  
}  

这只是调用系统中已经内置的浏览器进行下载,还没有WebView本身进行的文件下载。

8WebSettings的常用方法介绍
setJavaScriptEnabled(true); //支持js脚步
setPluginsEnabled(true);//支持插件
setUseWideViewPort(false);//将图片调整到适合webview的大小
setSupportZoom(true); //支持缩放
setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);//支持内容从新布局
supportMultipleWindows(); //多窗口
setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//关闭webview中缓存
setAllowFileAccess(true); //设置可以访问文件
setNeedInitialFocus(true);//当webview调用requestFocus时为webview设置节点
webSettings.setBuiltInZoomControls(true);//设置支持缩放
setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口
setLoadsImagesAutomatically(true);//支持自动加载图片

WebViewClient的方法全解
doUpdateVisitedHistory(WebViewview,Stringurl, boolean isReload)(更新历史记录)
onFormResubmission(WebViewview,MessagedontResend,Messageresend) (应用程序重新请求网页数据)
onLoadResource(WebViewview,Stringurl) 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。
onPageStarted(WebViewview,Stringurl,Bitmapfavicon)这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。
onPageFinished(WebViewview,Stringurl)在页面加载结束时调用。同样道理,我们知道一个页面载入完成,于是我们可以关闭loading 条,切换程序动作。
onReceivedError(WebViewview, int errorCode, Stringdescription,StringfailingUrl)(报告错误信息)
onReceivedHttpAuthRequest(WebViewview,HttpAuthHandlerhandler,Stringhost,Stringrealm)(获取返回信息授权请求)
onReceivedSslError(WebViewview,SslErrorHandlerhandler,SslErrorerror)重写此方法可以让webview处理https请求。
onScaleChanged(WebViewview, float oldScale, float newScale)(WebView发生改变时调用)
onUnhandledKeyEvent(WebViewview,KeyEventevent)(Key事件未被加载时调用)
shouldOverrideKeyEvent(WebViewview,KeyEventevent)重写此方法才能够处理在浏览器中的按键事件。
shouldOverrideUrlLoading(WebViewview,Stringurl)在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。这个函数我们可以做 很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。

webview与js交互

webview能做什么?
①webView可以利用html做界面布局,虽然目前还比较少人这么使用,不过我相信当一些客户端需要复杂的图文(图文都是动态生成)混排的时候它肯定是个不错的选择。
②直接显示网页,这功能当然也是它最基本的功能。
③和js交互。(如果你的js基础比java基础好的话那么采用这种方式做一些复杂的处理是个不错的选择)。

android与js的调用需要启用启用javascript调用

contentWebView = (WebView) findViewById(R.id.webview);
//启用javascript
contentWebView.getSettings().setJavaScriptEnabled(true);

Java调用js

Java代码调用js并传参其实是通过WebView的loadUrl方法去调用的、只是参数url的写法不一样而已

// 无参数调用
contentWebView.loadUrl("javascript:javacalljs()");
// 传递参数调用
contentWebView.loadUrl("javascript:javacalljswithargs(" 
        + "´hello world´" + ")");

javacalljs()和javacalljswithargs()就是javascript中的方法

js调用Java

将对象暴露给javascript脚本

contentWebView.addJavascriptInterface(this, "name");

这样在xxx.html中javascript可以通过js对象名来调用该对象的方法
注:addJavascriptInterface(object,”name”);//把Name=”name”的对象添加到object中。object如果是this,就是window.name

在网页中、只需要像调用js方法一样、进行调用就可以

<a onClick="window.name.jsFunction(´hello world´)" >
点击调用java代码并传递参数
</a>


android 4.2 之后版本提供给js调用的函数必须带有注释语句@JavascriptInterface ,4.2版本之前向webview注入的对象所暴露的接口不是必须带有@JavascriptInterface注释语句
(需要注意,android adt,eclipse生成的工程,低版本中会自动带有 anotations.jar,支持@JavascriptInterface, 而高版本中工程中,不会自动带有anotations.jar包,所以要加入注释语句@JavascriptInterface,首先要自己手动加入anotations.jar包,不要忘记import 哦!本人就犯过这么低级的错误哦)
(这里的限制是通过 targetSdkVersion 为标准,即如果工程采用了android sdk的版本是4.2以上,但是 targetSdkVersion 的版本在17之下,那么该状态下生成的应用,不过报错,如果targetSdkVersion 设置为>=17 就需要特别主意,要加上 @JavascriptInterface注释语句了, 所有建议在各种版本下都采用@JavascriptInterface注释,就万无一失了)

js Java 双向调用

Java和js交互注意事项

1、Java 调用 js 里面的函数、效率并不是很高、估计要200ms左右吧、做交互性很强的事情、这种速度很难让人接受、而js去调Java的方法、速度很快、50ms左右、所以尽量用js调用Java方法
2、Java 调用 js 的函数、没有返回值、调用了就控制不到了
3、Js 调用 Java 的方法、返回值如果是字符串、你会发现这个字符串是 native 的、转成 locale 的才能正常使用、使用 toLocaleString() 函数就可以了、不过这个函数的速度并不快、转化的字符串如果很多、将会很耗费时间
4、网页中尽量不要使用jQuery、执行起来需要5-6秒、最好使用原生的js写业务脚本、以提升加载速度、改善用户体验

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值