android中Webview与javascript的交互(互相调用)

Android 4.0


注意:
如果从服务器上获取html,AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误,且必须开启子线程获取html数据
如果访问的页面中有Javascript,则webview必须设置支持Javascript
settings.setJavaScriptEnabled(true);  
如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象。(没测试过)
webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
});
如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。
获取assets的路径写法:

webView.loadUrl("file:///android_asset/newsfont.html");
⑥android4.1.2,js可以调用android方法,在android4.2.2不可以???
Android和js互相调用的过程。
1、在and
roid的assets目录放置一个html文件(里面有js脚本)
2、通过加载本地的html文件(里面有js脚本),实现android本地方法和js中的交互
第一步:AndroidManifest.xml中加入网络权限
<uses-permission android:name="android.permission.INTERNET" />
第二步:
加载本地写好的html文件(定义好js中提供给android调用的方法 changeFont(),和android提供给js调用的对象接口 funFromAndroid(String name)  
),放在 assets目录下
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=GBK">
        <title>Android JS互相调用</title>
        <style type="text/css">
            /*超链接访问前,访问后样式一致*/
            a:link,a:visited{
                color:#0044ff;
                text-decoration:none;
            }
            a:hover{
                color:#ff8800;
            }
            #newstext{
                width:500px;
                border:#00ff00 1px solid;
                padding:10px;
            }
            /*预定义一些样式封装到选择器。一般使用类选择器。*/
            .norm{ /*注意不要和id中定义的样式冲突,否则加载不上,因为class选择器样式没有id选择器样式优先级高*/
                color:#000000;
                font-size:16px;
                background-color:#cdd8d0;
            }
            .max{
                color:#808080;
                font-size:28px;
                background-color:#9ce9b4;
            }
            .min{
                color:#ffffff;
                font-size:12px;
                background-color:#f1b96d;
            }
        </style>
    </head>
    
    <body>
     
        <script type="text/javascript">
        
            //该方法可以供android中代码调用
            function changeFont(selectorName){
                var oNewsText = document.getElementById("newstext");
                oNewsText.className = selectorName;
            }
            
            //该方法调用android中的方法
            function funFromAndroid(node){
                var str = node.innerHTML
                myObj.funFromAndroid('html点击:'+str);
            }
        </script>
        
        <a onclick="funFromAndroid(this)">JS中调用Android中的方法</a>
        <h1>这是一个新闻标题</h1>
        <hr/>
        <a href="javascript:void(0)" onclick="changeFont('max')">大字体</a> 
        <a href="javascript:void(0)" onclick="changeFont('norm')">中字体</a> 
        <a href="javascript:void(0)" onclick="changeFont('min')">小字体</a>
        <div id="newstext" class="norm">
            这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容
            这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容
            这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容
            这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容
            这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容
            这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容
            这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容
            这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容
            这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容
            这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容
            这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容
            这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容这是新闻内容
        </div>
    </body>
</html>

第三步: android调用js的相关代码
@SuppressLint("JavascriptInterface")
private void initWeb() {
    webView = (WebView) this.findViewById(R.id.wv_js);
    // 设置背景
    webView.setBackgroundColor(Color.TRANSPARENT);
    settings = webView.getSettings();
    // settings.setLoadsImagesAutomatically(true);
    // 设置编码
    settings.setDefaultTextEncodingName("utf-8");
    // 支持js,否则不能操作js
    settings.setJavaScriptEnabled(true);
    // 如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,
    // 必须覆盖,webview的WebViewClient对象
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            // view.loadUrl(url);
            return true;
        }
    });
    // 设置本地调用对象及其接口
    /**
     * 在js中调用android方法走的接口,如果只有android调用js,此接口可以不要
     * 
     * 参数一:js调用android方法调用的接口
     * 
     * 参数二:在js中使用到
     */
    webView.addJavascriptInterface(new JavaScriptObject(this), "myObj");
    // 载入html
    webView.loadUrl("file:///android_asset/newsfont.html");
}
android调用js方法,
// FIXME:1、android中调用js中的方法
public void small(View view) {
    webView.loadUrl("javascript:changeFont('min')");
    Toast.makeText(this"字体变小", Toast.LENGTH_SHORT).show();
}
public void middle(View view) {
    webView.loadUrl("javascript:changeFont('norm')");
    Toast.makeText(this"字体正常", Toast.LENGTH_SHORT).show();
}
public void large(View view) {
    webView.loadUrl("javascript:changeFont('max')");
    Toast.makeText(this"字体变大", Toast.LENGTH_SHORT).show();
}
第四步: js调用android的相关代码
①js调用的android对象方法定义
/**
 *js调用的android的接口定义
 */
class JavaScriptObject {
    Context mContxt;
    public JavaScriptObject(Context mContxt) {
        this.mContxt = mContxt;
    }
    /**
     * 供js调用android的方法定义
     * 
     * @param name
     */
    public void funFromAndroid(String name) {
        Toast.makeText(mContxt, name, Toast.LENGTH_SHORT).show();
    }
}
②js中调用
//该方法调用android中的方法
function funFromAndroid(node){
        var str = node.innerHTML
        myObj.funFromAndroid('html点击:'+str);
}
效果:
①android调用js

②js调用android

源码: