1.首先准备一个test.html文档,如下:

    js交互android    

从Android客户端传来的作者信息:

输入的信息:

注意看网页中《调用android方法》的button的点击事件,onclick中的内容就相当于指向android中adrdMethod()方法的id.

2.Android的布局文件如下:

<?xml version="1.0" encoding="utf-8"?>    

3.在WebView中加载test.html页面,并且与Android交互

界面.png
//@SuppressLint("SetJavaScriptEnabled")public class MainActivity extends AppCompatActivity {    private WebView webView;    private Button button;    final String  jsonStr = "{\"Developer\":\"Alden\",\"Place\":\"Nanjing\"}";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        webView = (WebView) findViewById(R.id.webview);        button = (Button) findViewById(R.id.btn);       webView.setWebChromeClient(new WebChromeClient() {            /*此处覆盖的是javascript中的alert方法。                    *当网页需要弹出alert窗口时,会执行onJsAlert中的方法                    * 网页自身的alert方法不会被调用。                    */            @Override            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {                Toast.makeText(getApplicationContext(), message,                        Toast.LENGTH_LONG).show();                Log.d("info", "弹出了提示框");                result.confirm();                return true;            }  /*此处覆盖的是javascript中的confirm方法。                   *当网页需要弹出confirm窗口时,会执行onJsConfirm中的方法                   * 网页自身的confirm方法不会被调用。                   */            @Override            public boolean onJsConfirm(WebView view, String url,                              String message, JsResult result) {                Log.d("info", "弹出了确认框");                result.confirm();                return true;            }            //在方法中写自己想要取代弹出js输入框的实现代码,比如一个Dialog            @Override            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {                Log.d("info", "弹出了输入框");                result.confirm();                return true;            }            /*                    * 如果页面被强制关闭,弹窗提示:是否确定离开?                    * 点击确定 保存数据离开,点击取消,停留在当前页面                    */            @Override            public boolean onJsBeforeUnload(WebView view, String url,    String message, JsResult result) {                Log.d("info", "弹出了离开确认框");                result.confirm();                return true;            }        });webView.setWebViewClient(new WebViewClient() {            /*点击页面的某条链接进行跳转的话,会启动系统的默认浏览器进行加载,调出了我们本身的应用                    * 因此,要在shouldOverrideUrlLoading方法中                    */            @Override            public boolean shouldOverrideUrlLoading(WebView view, String url) {                //使用当前的WebView加载页面                view.loadUrl(url);                return true;            }/*             * 网页加载完毕(仅指主页,不包括图片)             */            @Override            public void onPageStarted(WebView view, String url, Bitmap favicon) {                // TODO Auto-generated method stub                super.onPageStarted(view, url, favicon);            }            /*             * 网页加载完毕(仅指主页,不包括图片)             */            @Override            public void onPageFinished(WebView view, String url) {                // TODO Auto-generated method stub                super.onPageFinished(view, url);            }            /*             * 加载页面资源             */            @Override            public void onLoadResource(WebView view, String url) {                // TODO Auto-generated method stub     super.onLoadResource(view, url);            }            /*             * 错误提示             */            @Override            public void onReceivedError(WebView view, int errorCode,   String description, String failingUrl) {                // TODO Auto-generated method stubsuper.onReceivedError(view, errorCode, description, failingUrl);            }        }); //支持js代码(必须要的)webView.getSettings().setJavaScriptEnabled(true);        //设置是否支持缩放        webView.getSettings().setSupportZoom(false);        //js调用android的方法接口,第二个参数就相当于js对象找android中这个方法的钥匙,webView.addJavascriptInterface(new Object(){ //此方法内容须创建子线程操作,不然会出现下面这个错误//Uncaught Error: Error calling method on NPObject         @JavascriptInterface       public void adrdMethod() {        new Thread(new Runnable() {                   @Override                   public void run() {                       Log.d("info", "js调用了Android方法");                   }               }).start();            }        },"demo");        button.setOnClickListener(new View.OnClickListener() {      @Override            public void onClick(View v) {                Log.d("info", "Android调用了js方法");                        /*                         * 通过webView.loadUrl("javascript:xxx")方式就可以调用当前网页中的名称为xxx的javascript方法                         */                webView.loadUrl("javascript:rfInfo("+jsonStr+")");            }        });        webView.loadUrl("file:///android_asset/test.html");    }}

总结:

1.Android调用js中的方法:
通过webView.loadUrl("javascript:xxx")方式就可以调用当前网页中的名称为xxx的javascript方法
2.js调用Android中的方法:
webView.addJavascriptInterface(Object object,String str):第一个参数是一个类对象,第二个参数是js中调用此类中的方法的标识
3.js调用的android的方法中的操作需要在子线程中,不然报错
Uncaught Error: Error calling method on NPObject ;
4.首先你要支持js代码(必须要的)
webView.getSettings().setJavaScriptEnabled(true);

更多相关文章

  1. Android(安卓)保存图片到Sqlite数据库
  2. Android(安卓)4.0.1_r1源代码发布,更新获取方法
  3. Android全屏(包含3种隐藏顶部状态栏及标题栏和一种隐藏Android(安
  4. Android中JNI高级应用 - 本地C代码中创建Java对象及本地JNI对象
  5. 动态权限
  6. android中获取string字符串的方法
  7. [react native] 拆分bundle 与 android 加载
  8. Android屏幕100%适配方案
  9. java.lang.IllegalStateException Fragment already added: Home

随机推荐

  1. android蓝牙BLE(四) —— 实战
  2. android快捷键
  3. Android深入理解WebView——上
  4. 【Android(安卓)电量优化】电量优化 ( 获
  5. Android(安卓)Selector
  6. android中如何执行java命令
  7. Android之Handler
  8. 为Android加入busybox工具
  9. Android入门教程五十五之DrawerLayout(官
  10. android内存管理