WebView的详细介绍

1.WebView.loadUrl()方法

1)WebView.loadUrl(String url);

url可以是本地的一个文件,如html放在本地的assets文件夹下,      url=file:///android_asset/xxx.html,url也可以是一个网络地址。

2)WebView.loadUrl(String url,Map<String,String> additionalHttpHeaders);
url同1),additionalHttpHeaders代表一些参数信息。


2.WebSettings webSettings = mWebview.getSettings();

 当WebView销毁后,再使用WebSettings会抛出IllegalStateException异常。

 WebSettings常用方法

 1)setAllowFileAccess, 设置是否可以访问文件数据

 2)setBlockNetworkImage, 是否显示网络图像

 3) setSupportZoom;是否支持缩放 

 4)setBuiltInZoomControls, 是否出现缩放工具

 5)setCacheMode, 设置缓存模式

 6)setDefaultFontSize, 设置默认字体大小

 7)setDefaultTextEncodingName, 设置默认的解码方式  如:setDefaultTextEncodingName("utf-8");

 8)setFixedFontFamily, 设置固定使用的字体

 9)setJavaScriptEnabled, 是否支持JavaScript

 10)setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN), 设置布局方式,支持内容重新布局

 11)setLightTouchEnabled 设置用鼠标激活被选项

 12)setUseWideViewPort(false); //将图片调整到适合webview的大小

 13)supportMultipleWindows(); //多窗口

 14)setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存


3.使用WebViewClient

WebViewClient用来处理各种通知、请求等事件,WebView调用setWebViewClient()来指定一个WebViewClient对象。

WebViewClient常用方法

1)doUpdateVisitedHistory(WebView view, String url, boolean isReload)

     更新历史记录

2)onFormResubmission(WebView view, Message dontResend, Message resend)

     重新请求网页数据

3)onLoadResource(WebView view, String url)

     加载页面资源的时候调用,每个资源的加载都会调用一次

4)onPageFinished(WebView view, String url)

     在页面加载结束时调用。

5)onPageStarted(WebView view, String url, Bitmap favicon) 

     这个事件就是开始载入页面调用的。

6)onReceivedError(WebView view, int errorCode, String description, String failingUrl)

    加载错误的时候调用,在里面可做一些错误处理。(如再请求一次,或者提示404的错误页面)

7)public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error)

    当使用以https://开头的网站出现错误时调用这个方法。

8)onScaleChanged(WebView view, float oldScale, float newScale)

    WebView发生改变的时候调用

9)shouldOverrideUrlLoading(WebView view, String url)

    每次html页面中的超链接加载前都会走这个方法。 

10)public WebResourceResponse shouldInterceptRequest(WebView view,String url)

    在每一次请求资源时,都会调用这个方法。


<一> onPageFinished()、onPageStarted()方法

 onPageFinished在页面加载结束的时候调用,在这里我们可以进行一些关闭进度条、执行新需求等的操作。

 onPageStarted在页面刚开始加载的时候调用,在这里我们可以显示一些进度条的操作。


<二> public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error)方法

我们知道HTTPS协议是通过SSL来通信的,所以当使用HTTPS通信的网址(以https://开头的网站)出现错误时,就会通过onReceivedSslError回调通知过来。

  • WebView view:当前的WebView实例
  • SslErrorHandler handler:当前处理错误的Handler,它只有两个函数SslErrorHandler.proceed()和SslErrorHandler.cancel(),SslErrorHandler.proceed()表示忽略错误继续加载,SslErrorHandler.cancel()表示取消加载。在onReceivedSslError的默认实现中是使用的SslErrorHandler.cancel()来取消加载,所以一旦出来SSL错误,HTTPS网站就会被取消加载了,如果想忽略错误继续加载就只有重写onReceivedSslError,并在其中调用SslErrorHandler.proceed()
  • SslError error:当前的的错误对象,SslError包含了当前SSL错误的基本所有信息。
mWebView.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        /**注意这里一定要注释掉!**/
        // super.onReceivedSslError(view, handler, error);  
        handler.proceed();
        Log.e("ruxing", "sslError:" + error.toString());
    }
});

<三> shouldOverrideUrlLoading(WebView view, String url)方法

参数url是拦截到的url。加载超链接的时候回调回来,拦截url跳转(点击页面中的链接会调用这个方法),在里面添加点击链接的跳转或操作。如果我们return true,则WebView接下来就不会再加载这个URL了。如果我们return false,则系统就认为上层没有做处理,接下来还是会继续加载这个URL的。WebViewClient默认就是return false的。

return true

public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.contains("https://www.hao123.com")){
        view.loadUrl("http://www.baidu.com");
    }else {//对不需要拦截的url,也需要重新调用loadUrl()方法
        view.loadUrl(url);
    }
    return true;
}
其实在我们return true以后,虽然我们拦截了url,但是这个url还是会请求网络的,只是这个请求以后结果并没有通过WebView加载。

return false

mWebView.setWebViewClient(new WebViewClient(){
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.contains("blog.csdn.net")){//只需要找到需要拦截的,对需要拦截的进行处理就行
            view.loadUrl("http://www.baidu.com");
        }
        return false;
    }
}

在利用shouldOverrideUrlLoading来拦截某一部分URL时,如果return true,则会屏蔽系统默认的显示URL(所有)结果的行为,不需要处理的URL也需要再调用loadUrl()来加载进WebVIew,不然就会出现白屏;如果return false,则系统默认的加载URL行为是不会被屏蔽的,所以一般建议大家return false,我们只关心我们需要拦截的拦截内容,对于不拦截的内容,让系统自己来处理即可。


4.使用WebChromeClient

WebChromeClient用来处理JavaScript对话框、网站图标、网站title、加载进度等。如何不设置WebView.setWebChromeClient(new WebChromeClient());点击网页中的对话框等是没有反应的。

WebChromeClient常用方法

1)publicbooleanonJsAlert(WebView view, String url, String message,JsResult result)

当网页调用alert()来弹出alert弹出框前回调,用以拦截alert()函数。

2)publicbooleanonJsConfirm(WebView view, String url, String message,JsResult result)

当网页调用confirm()来弹出confirm弹出框前回调,用以拦截confirm()函数。

3)publicbooleanonJsPrompt(WebView view, String url, String message,String defaultValue , Js PromptResult result) :

当网页调用prompt()来弹出prompt弹出框前回调,用以拦截prompt()函数。

4)publicbooleanonConsoleMessage(ConsoleMessage consoleMessage)

打印 console 信息 

5)publicvoidonProgressChanged(WebView view,int newProgress)

通知程序当前页面加载进度


<一>alert、confirm、prompt

1)2)3)详细介绍:他们是处理弹出的alert、confirm、prompt对话框。

html:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 id="h">欢迎光临启舰的blog</h1>
<button οnclick="confirm('哈哈哈哈')">confirm</button>
<button οnclick="alert('啦啦啦啦')">alert</button>
<button οnclick="prompt('嘻嘻嘻嘻')">prompt</button>
</body>
</html>

activity:

public class MyActivity extends Activity {
    private WebView mWebView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mWebView = (WebView)findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.setWebViewClient(new WebViewClient());
        mWebView.setWebChromeClient(new WebChromeClient());

        mWebView.loadUrl("file:///android_asset/web.html");
    }
}

在activity中,mWebView.setWebChromeClient(new WebChromeClient());这句话是不能少的,如果没有这句话,点击cnfirm、alert、prompt这三个按钮是没有任何反应的(除了这三个,其他的是不需要强制设置WebChromeClient的),只有加上这句话才能弹出对应的弹出框,而WebChromeClient()中的onJsAlert、onJsConfirm、onJsPrompt方法是起到拦截作用,当点击按钮的时候不会再弹出对话框,可以自己定义点击之后的操作。如
mWebView.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        /**这句话是拦截后的操作,这里是弹出了一个吐司,也可以做其他的一些操作。**/
        Toast.makeText(MyActivity.this, "xxx", Toast.LENGTH_SHORT).show();
        /**这句话非常重要,它表示向WebView通知操作结果。
          *JsResult有两个函数:JsResult.confirm()JsResult.cancel()          *JsResult.confirm()表示点击了弹出框的确定按钮,
          * JsResult.cancel()则表示点击了弹出框的取消按钮。
          *如果没有使用JsResult来告诉WebView处理结果,
          * WebView就会认为这个弹出框还一直弹在那里,
          *你再点击alert按钮,将会无效;**/
        result.confirm();
        /**表示告诉WebView我们已经拦截了alert()函数,不需要再弹出网页中的alert弹出框了。
          *如果我们return false,那么WebView就会认为我们没有拦截alert()函数,
          * 会继续弹出alert对话框。**/
        return true;
    }
});

<二>onConsoleMessage()方法

这个方法的作用就是拦截日志信息的打印,可以在这个方法里对这些日志信息进行操作。
mWebView.setWebChromeClient(new WebChromeClient(){
    @Override
    public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
        Toast.makeText(MyActivity.this,consoleMessage.message(),Toast.LENGTH_SHORT).show();
        /**return ture表示日志信息不再在控制台输出**/
        return  true;
    }

});

<三>
publicvoidonProgressChanged(WebView view,int newProgress)方法
  • WebView view:当前WebView实例
  • int newProgress:当前的加载进度,值从0到100
  • mWebView.setWebChromeClient(new WebChromeClient(){
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            super.onProgressChanged(view, newProgress);
            Log.e("ruxing","progress:"+newProgress);
        }
    });
    底层实现时,是利用handler来定时轮循当前进度的,每隔一定时间查询一次,所以每次拿到的进度数据是不一样的,也就是说如果页面较简单,可能会直接返回100,而跳过中间的各个数据。也就是说,除了100,其它任何一个数值不是一定返回的。




5.按键返回

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

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    //改写物理返回键的逻辑
    if(keyCode==KeyEvent.KEYCODE_BACK) {
        if(mWebView.canGoBack()) {
            mWebView.goBack();//返回上一页面 
            return true;
        } else {
            System.exit(0);//退出程序 
        }
    }
    return super.onKeyDown(keyCode, event);
}

6.如何强制使用外部浏览器打开网页

如果不想在 webview 中显示网页,而是直接跳转到浏览器的话,可以像下边那样调用。

Uri uri = Uri.parse("http://www.example.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);


7.native与JS交互

<一>JS调用java

JS调用java需要用到WebView的一个方法

public void addJavascriptInterface(Object obj, String interfaceName);webview绑定javascriptInterface,js脚本通过这个接口来调用java代码。

obj:自定义的JavaScript类对象(也可以是WebView所在的Activity本身),映射成js对象注入到WebView,这个      Object是在本地定义的,供JS访问的。

interfaceName:这是一个别名,js脚本通过这个别名来调用java的方法。通过这个别名调用obj中的方法。

例如:

MainActivity中:

//设置编码
mWebView.getSettings().setDefaultTextEncodingName("utf-8");
//支持js
mWebView.getSettings().setJavaScriptEnabled(true);
//设置背景颜色 透明
mWebView.setBackgroundColor(Color.argb(0, 0, 0, 0));
//设置本地调用对象及其接口
mWebView.addJavascriptInterface(new JavaScriptObject(mContext), "myObj");
//载入js
mWebView.loadUrl("file:///android_asset/test.html");

JavaScriptObject:

public class JavaScriptObject {
    Context mContxt;

    public JavaScriptObject(Context mContxt) {
        this.mContxt = mContxt;
    }

    public String fun1FromAndroid(String value) {
        //valueJS返回给的数据,可以在这里对value数据进行操作
        Toast.makeText(mContxt, value, Toast.LENGTH_LONG).show();
        //可以在这个方法里把有用的数据传给JS
        return "JS调用java返回的数据";
    }
}
html:

<script>
  function funFromjs(){
   document.getElementById("helloweb").innerHTML="HelloWebView,i'm from js";
  }
  var aTag = document.getElementsByTagName('a')[0];
  aTag.addEventListener('click', function(){
  //调用android本地方法
  myObj.fun1FromAndroid("调用android本地方法fun1FromAndroid(String name)!!");
      return false;
  }, false);
</script>

<二>java调用JS

java调用JS是通过WebView.loadUrl(String url)方法实现的。

String url="javascript:methodName(params……);";

WebView.loadUrl(url);

javascript:伪协议,让我们可以通过一个链接来调用JavaScript函数 
methodName:JavaScript中实现的函数 
jsonParams:methodName方法需要传入的参数列表 

例如:

MainActivity:

//点击调用js中方法
mBtn1.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        mWebView.loadUrl("javascript:funFromjs()");
    }
});

html:

<script>
  function funFromjs(){
   document.getElementById("helloweb").innerHTML="HelloWebView,i'm from js";
  }
  var aTag = document.getElementsByTagName('a')[0];
  aTag.addEventListener('click', function(){
  //调用android本地方法
  myObj.fun1FromAndroid("调用android本地方法fun1FromAndroid(String name)!!");
      return false;
  }, false);
</script>


其他关于webview的学习:http://www.jianshu.com/p/3c94ae673e2a




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值