美文网首页
Android WebView与js交互

Android WebView与js交互

作者: xiesen | 来源:发表于2019-07-13 21:58 被阅读0次

    js调用原生方法

    设置WebView支持JavaScript

    //设置WebView支持JavaScript
    mWebView.getSettings().setJavaScriptEnabled(true);
    

    在js中调用本地java方法

    //在js中调用本地java方法 "jsApi"表示通过给js调用的对象名
    mWebView.addJavascriptInterface(new JsInterface(this), "jsApi");
    

    定义JsInterface

    JsInterface中的方法与前端小伙伴一起定义

       private class JsInterface {
            private Context mContext;
    
            public JsInterface(Context context) {
                this.mContext = context;
            }
    
            //在js中调用window.jsApi.show(name),便会触发此方法。
            @JavascriptInterface
            public void show(String name) {
                Toast.makeText(mContext, name, Toast.LENGTH_SHORT).show();
            }
            //在js中调用window.jsApi.test(name),便会触发此方法,返回一个字符串。
            @JavascriptInterface
            public String test(String str){
    
                String bbb = "大哥你好";
    
                return bbb;
            }
            /**在js中调用window.jsApi.testCallback(fnName,prames),便会触发此方法。
            *prames为json字符串,通过Gson解析。
            *fnName为一个方法名,需要调用js中的方法
            */
            @JavascriptInterface
            public void testCallback(String fnName,String prames){
    
                JsonObject jsonObject = new JsonParser().parse(prames).getAsJsonObject();
                String name = jsonObject.get("name").getAsString();
                String age = jsonObject.get("age").getAsString();
                System.out.println(name+"++++++++++++++");
                System.out.println(age+"++++++++++++++");
                Map<String,String> map = new HashMap<String, String>();
                map.put("name","大哥");
                map.put("age","122");
                String jsonString = new Gson().toJson(map);
                mWebView.loadUrl("javascript:"+fnName+"('" + jsonString + "')");
            }
        }
    

    原生调用js方法

    在java中调用js方法

     //调用js中的函数:jsname(prames)
    webView.loadUrl("javascript:jsname('" + prames + "')");
    

    解决:Android出现All WebView methods must be called on the same thread.

    新版的Android的SDK要求在创建WebView所在的线程中操作它,在其它线程中操作它都会报这个错误。

    RefreshActivity.this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
        //若是需要参数,则将参数定义为全局参数
            webview.loadUrl("http://www.lanhusoft.com");  
        }
    });
    

    RefreshActivity就是webview所在的Activity。

    webview是通过webview = (WebView) findViewById(R.id.webViewName);获取到的对象实例。

    相关文章

      网友评论

          本文标题:Android WebView与js交互

          本文链接:https://www.haomeiwen.com/subject/shcvkctx.html