当前位置: 代码迷 >> JavaScript >> 兑现android与javascript相互调用
  详细解决方案

兑现android与javascript相互调用

热度:384   发布时间:2012-09-15 19:09:28.0
实现android与javascript相互调用
本文出自:http://androidkaifa.com/thread-247-1-1.html

欢迎转载,转载请注明出自:www.androidkaifa.com
下面www.androidkaifa.com为大家分享一个实现androidjavascript相互调用的项目,下面笔者为大家概况几个知识要点:
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"
   androidrientation="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"
             androidrientation="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>

  相关解决方案