Android 与WebView中的js代码的交互记录

  最近公司的项目用到原生和WebView的HTML中代码进行交互,遇到到不少问题,在这里记录一下,以后再用的时候方便。

- 首先说一下WebSettings的配置,它是用来管理WebView配置的类

WebSettings webSettings = webView.getSettings();//通过webView获取WebSettings 
/*WebSettings常用方法*/
webSettings.setUseWideViewPort(true);// 设置此属性,可任意比例缩放
webSettings.setSupportZoom(true);//设置是否支持缩放
webSettings.setBuiltInZoomControls(true);//显示或不显示缩放按钮(wap网页不支持)
webSettings.setJavaScriptEnabled(true);  //支持js
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);  /*设置 缓存模式LOAD_DEFAULT:默认的缓存使用模式。在进行页面前进或后退的操作时,如果缓存可用并未过期就优先加载缓存,否则从网络上加载数据。这样可以减少页面的网络请求次数。
LOAD_CACHE_ELSE_NETWORK:只要缓存可用就加载缓存,哪怕它们已经过期失效。如果缓存不可用就从网络上加载数据。
LOAD_NO_CACHE:不加载缓存,只从网络加载数据。
LOAD_CACHE_ONLY:不从网络加载数据,只从缓存加载数据*/
webSettings.setAppCacheEnabled(true);//启用或禁用应用缓存
webSettings.setAppCachePath(String appCachePath);//设置应用缓存路径,这个路径必须是可以让app写入文件的。该方法应该只被调用一次
webSettings.setBlockNetworkImage(true);//关闭加载网络图片,在一开始加载的时候可以设置为true,当加载完网页的时候再设置为false
  • WebView的WebChromeClient中常用的方法的说明
webView.setWebChromeClient(new WebChromeClient(){

            //当页面加载的进度发生改变时回调,用来告知主程序当前页面的加载进度。
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                // TODO Auto-generated method stub
                super.onProgressChanged(view, newProgress);
            }
            //用来接收web页面的icon
            @Override
            public void onReceivedIcon(WebView view, Bitmap icon) {
                // TODO Auto-generated method stub
                super.onReceivedIcon(view, icon);
            }
            //用来接收web页面的title
            @Override
            public void onReceivedTitle(WebView view, String title) {
                // TODO Auto-generated method stub
                super.onReceivedTitle(view, title);
            }
            //处理Javascript中的Alert对话框,返回为true,就是拦截html页面不弹出 Alert,
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                // TODO Auto-generated method stub
                return super.onJsAlert(view, url, message, result);
            }
            //处理Javascript中的Prompt对话框
            @Override
            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue,
                    JsPromptResult result) {
                // TODO Auto-generated method stub
                return super.onJsPrompt(view, url, message, defaultValue, result);
            }
            //处理Javascript中的Confirm对话框
            @Override
            public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
                // TODO Auto-generated method stub
                return super.onJsConfirm(view, url, message, result);
            }
        });
  • WebView的WebViewClient中常用的方法的说明
webView.setWebViewClient(new WebViewClient(){

            //WebView加载资源调用,返回为true的话就在本app里面调用,false就在外部浏览器中打开。
            //这个方法还可以拦截到打开的链接的地址,可以在此跟原生的做一些交互
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                // TODO Auto-generated method stub
                return true;
            }

            //该方法只在WebView完成一个页面加载时调用一次
            @Override
            public void onPageFinished(WebView view, String url) {
                // TODO Auto-generated method stub
                super.onPageFinished(view, url);
            }
            //页面发生错误时候调用,这些错误通常都是由无法与服务器正常连接引起的,最常见的就是网络问题
            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                // TODO Auto-generated method stub
                super.onReceivedError(view, request, error);
            }

        });
  • 在Activity中调用html的js方法
String data = "\"我是app\""
webView.loadUrl("javascript:queryRecomend(" + data  + ")");

调用js方法要特别注意一下,如果传递的是字符串,就用引号把字符串包裹起来,要不然数据就传递不成功。。。。

  • 在html中js调用Activity的方法

android中的代码:
  /**
     * 注意第二个参数JsTest,这个是JS网页调用Android方法的一个类似ID的东西  
     */
        mWebView.addJavascriptInterface(new JavaScriptinterface (this), "android");  
        public class JavaScriptinterface {
    Context context;
    public JavaScriptinterface(Context c) {
        context= c;
    }

    /**
     * 与js交互时用到的方法,在js里直接调用的
     */
    @JavascriptInterface
    public void showToast(String ssss) {

        Toast.makeText(mContext, ssss, Toast.LENGTH_LONG).show();
    }
}


/**
*JS代码:注意这里android.JsCallAndroid中的android和activity中的*addJavascriptInterface中的android名字要一样
*/
<script type="text/javascript">   
function showToast() {       
    android.JsCallAndroid("哈哈啊哈 ");
     }
</script>

</head>
<body>
<input type="button" value="调用"
     onClick="showToast()"/>
</body>

注意:如果用shouldOverrideUrlLoading方法中通过返回的url来响应原生的一些方法时候(url中带有特殊符号,比如:& = 等。。),html的url要通过encodeURIComponent(url)进行转码,手机端通过URLDecoder.decode(url)转码获取都这个url,如果不转码进行传送回收不到这个url(IOS是这样的)。还有就是,在 原生调用JS的方法时候,传递的参数是字符串,要用 \” 把这个字符串包裹起来比如:(”\”我是app\”“),如果是数字就不必了,要不html识别不了这个字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值