使用Android的WebView控件调用本地代码
2014-02-14 14:31
441 查看
使用Android的WebView控件调用本地代码
需要读者具备一定的相关语言的编程基础。
环境搭建简述
* 打开 http://developer.android.com/ ,下载集成android SDK的 Eclipse版本
* 打开 http://www.java.com/ , 下载最新版本对应的 JDK。注意,是JDK,不是JRE
安装完后,配置好JAVA_HOME路径,打开Eclipse,新建一个 Android Application Project ,直接运行。
如果成功,则会打开一个 Android 模拟器,显示helloworld。
如果上面步骤不成功。。。则要搞到成功为止才能进行下一步。。。
我操作的时候,Eclipse 所带 SDK 版本是 KitKat。相比以前,搭建Android开发环境简单了很多。
打开项目里面的 MainActivity.java 文件。
把下面代码拷贝进去,复盖原来的,重新编译运行一下,就能看到效果。
这是我刚调出来的,比较稳妥的做法,部分代码参考自互联网,代码细节请自行研究,拿去吧,不客气。(Android 2.1 也能通过)
需要读者具备一定的相关语言的编程基础。
环境搭建简述
* 打开 http://developer.android.com/ ,下载集成android SDK的 Eclipse版本
* 打开 http://www.java.com/ , 下载最新版本对应的 JDK。注意,是JDK,不是JRE
安装完后,配置好JAVA_HOME路径,打开Eclipse,新建一个 Android Application Project ,直接运行。
如果成功,则会打开一个 Android 模拟器,显示helloworld。
如果上面步骤不成功。。。则要搞到成功为止才能进行下一步。。。
我操作的时候,Eclipse 所带 SDK 版本是 KitKat。相比以前,搭建Android开发环境简单了很多。
打开项目里面的 MainActivity.java 文件。
把下面代码拷贝进去,复盖原来的,重新编译运行一下,就能看到效果。
这是我刚调出来的,比较稳妥的做法,部分代码参考自互联网,代码细节请自行研究,拿去吧,不客气。(Android 2.1 也能通过)
package com.example.appa; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.webkit.JavascriptInterface; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends Activity { private WebView webview = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main);//可要可不要 initWebWiew(); } @JavascriptInterface private void initWebWiew() { if( webview == null ) { //实例化WebView对象 webview = new WebView(this); //设置WebView属性,能够执行Javascript脚本 webview.getSettings().setJavaScriptEnabled(true); //加载第一个页面,页面不能太大 //loadWebsite();//load外网地址 loadLocal();//加载本地 //设置Web视图 setContentView(webview); } } private void loadWebsite() { //如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象。 webview.setWebViewClient( new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } } ); webview.loadUrl("http://www.baidu.com/"); } private Handler mHandler = new Handler(); @JavascriptInterface private void loadLocal() { /* *这是老版本的写法 Object interfaceObject = new Object() { public void onClickAndroid() { mHandler.post( new Runnable() { public void run() { webview.loadUrl("javascript:wave()"); } } ); } }; webview.addJavascriptInterface(interfaceObject, "androidCallback"); */ //android 4.2, JDK1.7后新版本写法 webview.addJavascriptInterface(new JsObject(), "androidCallback"); //这个 onClickAndroid() 和 androidCallback 的命名,就是对应HTML里面的window.androidCallback.onClickAndroid webview.loadData(tp, "text/html", "utf-8"); } private class JsObject { private String param; @JavascriptInterface public void onClickAndroid(String p) { param = p; mHandler.post( new Runnable() { public void run() { Log.d("dbg", "receive param:" + param); String s = param + " " + String.valueOf( Math.round( Math.random()*100 ) ); /* try { s = URLEncoder.encode(s, "utf-8"); } catch (Exception e) { s = "Error"; } */ //webview.loadData(s, "text/html", "utf-8"); webview.loadUrl("javascript:responseFromAndroid('" + s + "')"); } } ); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } //如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) { webview.goBack(); return true; } return super.onKeyDown(keyCode, event); } private static final String tp = "<font color='#FF00FF'><h1>Test</h1></font>" + "name:<input type='text' id='txtName'/><br>" + "age:<input type='text' id='txtAge'/><br>" + "message:<input type='text' id='txtResult' value=''/><br>" + "<input type='button' id='btnGo' value='go' onClick='onClickA()'/>" + "<script>" + "function onClickA() {" + " var name = document.getElementById('txtName').value;" + " var age = document.getElementById('txtAge').value;" + " var s = name + ',' + age;" + " window.androidCallback.onClickAndroid(s);" + "}" + "function responseFromAndroid(s) { " + "document.getElementById('txtResult').value = s;" + "}" + "</script>"; }
相关文章推荐
- Android之Webview使用Java代码和JS相互调用
- Android使用webview控件加载本地html,通过Js与后台Java实现数据的传递
- Android使用WebView播放flash的方法和JavaScript调用本地方法
- Android中使用WebView调用java代码
- Android WebView使用之JavaScript调用Java代码注意事项
- android webview 调用本地java代码失败解决方法
- WebView原生方法---使用javascript调用android代码
- Android WebView的使用(三)js、java代码调用出错
- Android 下拉刷新控件SwipeRefreshLayout结合WebView使用
- Android WebView的使用方法及与JS 相互调用
- Webview中js与本地java代码的互相调用
- Android中WebView使用html,且实现android和JS的互相调用
- Android WebView中的JavaScript代码使用(转载)
- [android进阶]webview控件的使用
- Android WebView使用本地字体
- webview调用android代码
- android开发 友盟推送点击Notification使用WebView加载url同时会调用系统浏览器的问题
- Android使用webview调用系统浏览器以及项目内显示并支持图片和输入
- WebView加载html代码,js脚本中调用android对象的方法...
- android 使用WebView获得加载网页的html代码