实现android与javascript相互调用
本文出自:http://androidkaifa.com/thread-247-1-1.html
欢迎转载,转载请注明出自:www.androidkaifa.com
下面www.androidkaifa.com为大家分享一个实现android与javascript相互调用的项目,下面笔者为大家概况几个知识要点:
1.用WebView来显示HTML代码2.允许WebView执行JavaScript webView.getSettings().setJavaScriptEnabled(true);3.获取到HTML文件,也可从网络中获取webView.loadUrl("file:///android_asset/index.html"); //HTML文件存放在assets文件夹中(3):它是一个非常好的方法,但同时也存在安全危险,因为当HTML中的WebView存在完全隐患时,攻击者可以通过HTML页面向你的应用注入病毒,除非这个HTML文件是完全你你个人写的,排除存在完全隐患了,所以www.androidkaifa.com推荐大家不要轻易从网络或是其它地方在你的项目中通过activity加载来一个javasrcipt文件,代码:2:首先我们要在配置文件加入<uses-permission android:name="android.permission.INTERNET"/>权限2:在项目的asset文件夹下面创建一个www文件,并将你的html文件存放在这文件下面,main.xml布局文件中则包含textview和webview控件,main.xml:<?xml version="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android
rientation="vertical" > <WebView android:id="@+id/webView1" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" />
<LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android
rientation="vertical" android:layout_weight="1"> <TextView
android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="match_parent" android:textAppearance="?android:attr/textAppearanceLarge"/> </LinearLayout></LinearLayout>3: JavaScriptInterfaceDemoActivity.java内容public class JavaScriptInterfaceDemoActivity extendsActivity { privateWebView Wv; privateTextView myTextView; finalHandler myHandler = new Handler();
/** Calledwhen the activity is first created. */ @Override public voidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.main); Wv =(WebView)findViewById(R.id.webView1); myTextView = (TextView)findViewById(R.id.textView1); finalJavaScriptInterface myJavaScriptInterface = new JavaScriptInterface(this); //创建一个JavaScriptInterface对象
Wv.getSettings().setLightTouchEnabled(true); Wv.getSettings().setJavaScriptEnabled(true);// 设置JavaScript启用。// 添加一个对象, 让JS可以访问该对象的方法, 该对象中可以调用JS中的方法 Wv.addJavascriptInterface(myJavaScriptInterface,"AndroidFunction"); Wv.loadUrl("file:///android_asset/www/index.html"); //加载HTML文件 }
public classJavaScriptInterface { ContextmContext;
JavaScriptInterface(Context c) { mContext = c; }
public void showToast(String webMessage){ finalString msgeToast = webMessage; myHandler.post(new Runnable() { @Override public void run() { // 执行UI线程 myTextView.setText(msgeToast); } });
Toast.makeText(mContext, webMessage,Toast.LENGTH_SHORT).show(); } }}在这个类的onCreate方法中先是通过ID绑定了webview 和textview两个控件,然后是创建了一个JavaScriptInterface内部类,内部类有一个构造方法,用于初始化context,而在showToast方法中则是通过Handler运行一个用户线程来更新UI,4:index.html文件:<!DOCTYPE ><htmlxmlns="http://www.w3.org/1999/xhtml" debug="true"> <head> <metahttp-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta name="viewport"content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=0"> <metaname="apple-mobile-web-app-capable" content="yes"> <metaname="viewport" content="target-densitydpi=device-dpi"/> <scripttype="text/javascript"> function init() { vartestVal = document.getElementById('mytextId').value; AndroidFunction.showToast(testVal); } </script> </head> <body> <divstyle="float: left;width: 50%;"> <input type="text" style="width: 180px;"name="myText" id="mytextId" />
</div> <divstyle="clear: both;height: 3px;"> </div> <div> <input value="submit" type="button"name="submit" id="btnSubmit"onclick="javascript:return init();" /> </div>
</body>
</html>