Android下的WebView与JS交互

来源:互联网 发布:医疗器械人工智能协会 编辑:程序博客网 时间:2024/06/02 13:20

我想把自己一点相关的经验分享出来,尽量写的清晰点吧,其实逻辑不难,如果大家有更好的方法,请多教.
需求是这样:
使用webview加载一个html页面,填入信息之后,点击确认按钮,要获取JS的返回的一个id值,然后通过这个值去访问接口,再获取微信支付所必须的参数来调起微信支付,之前并没有涉及到webview与JS交互,网上关于这方面的资料并不多,零零碎碎收集了一些信息,一整和,总算是有点头绪.

我把关键代码贴上

```  private String sentence = "javascript:window.recharge.show(document.getElementById('标签的ID').value);";//这是JS语句 @Override    protected void initView()     {        setContentView(R.layout.recharge);        ButterKnife.bind(this);        api = WXAPIFactory.createWXAPI(this, Constants.WX_APP_ID);        api.registerApp(Constants.WX_APP_ID);}
private String url;@Overridepublic void initData() {    super.initData();    Intent intent = getIntent();    url= intent.getStringExtra("URL");//这里获取的是html地址    initWebView();//对webview进行初始化}
private void initWebView() {        mWebView.loadUrl(url);//这里是加载页面        mWebView.getSettings().setJavaScriptEnabled(true);//设置webview支持Javascript        mWebView.addJavascriptInterface(new Recharge(), "recharge");//将一个java对象绑定到一个javascript对象中,就是暴露一个对象让js调用,看看上面的JS语句,就明白这两个参数的意思了        mWebView.setWebChromeClient(new WebChromeClient());        mWebView.setWebViewClient(new MyWebViewClient());//处理事件    }
  class Recharge{//这是内部类        @JavascriptInterface        public void show(String data) {//提供给JS调用的方法,这个参数就是我们要得到的            postWXRequest(data);//拿这个参数去请求微信支付所需数据        }    }    private class MyWebViewClient extends WebViewClient {        @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {//这个方法是检测到页面刷新就执行,因为用户点击确认按钮之后,页面就会刷新,所以我在这里 自己调用JS的函数来获取返回值           view.loadUrl(sentence);//这是执行JS语句,获取参数并调用show()方法;            return true;        }    }    }
0 0