1. 程式人生 > >android與js交互

android與js交互

call tex meta roi version window 裏的 使用 過程

首先引用一篇文章,看過這篇文章基本上就明白android大致與js是如何交互的了

Android與HTML+JS交互入門

----------------------------分割線-----------------------------------

首先要知道js是啥,js就相當於在html內的函數方法,全稱為javascript

那麽要交互,必然二者要共存於一起,在android中如何打開一個頁面,比較常用的方法就是使用一個WebView控件,用它來加載網頁

交互也必然是雙方的,有來有往,下面分兩部分說明

PS:這裏直接援引前面文章中的例子,稍作修改

1,android中調用js

那麽首先得有js,不然怎麽調用,所以html如下

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
<script type="text/javascript">

function javacalljs(){
     document.getElementById("content").innerHTML =
         "<br\>JAVA調用了JS的無參函數";
}

function javacalljswith(arg){
     document.getElementById(
"content").innerHTML = ("<br\>"+arg); } </script> </head> <body> HTML 內容顯示 <br/> <h1><div id="content">內容顯示</div></h1> </body> </html>

這裏需註意的是,兩個方法的名稱需要與之後調用的名稱相同:javacalljs,javacalljswith

那麽將它放入工程內,或是部署在服務器上,隨後在webView中加載這個url

這裏只寫出webView加載該url的代碼

        contentWebView = (WebView) findViewById(R.id.webview);
        // 啟用javascript
        contentWebView.getSettings().setJavaScriptEnabled(true);
        // 從assets目錄下面的加載html
        contentWebView.loadUrl("file:///android_asset/web.html"); 

這裏因為作者使用的是放入工程的方法,故而loadUrl方法內傳遞的是一個本地的相對地址

到這裏webView加載網頁就完成了,那麽如何使用webView調用其中的js呢

contentWebView.loadUrl("javascript:javacalljs()");

亦或者是

contentWebView.loadUrl("javascript:javacalljswith(" + "‘http://blog.csdn.net/Leejizhou‘" + ")");

兩者都是之前在html內定義過的js函數名,一個有參一個無參(這裏為尊重援引博文的作者,參數內的博客地址就不修改了)

到這為之,android中調用js就完成了

那麽交互交互,反過來,如何在html代碼內與android交互呢

修改一下html的代碼

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
</head>
<body>
HTML 內容顯示 <br/>
<h1><div id="content">內容顯示</div></h1>
<br/>
<input type="button"  value="點擊調用java代碼" onclick="window.android.startFunction()" />
<br/>
<input type="button"  value="點擊調用java代碼並傳遞參數" onclick="window.android.startFunction(‘http://blog.csdn.net/Leejizhou‘)"  />
</body>
</html>

這裏可以看到,正如學習android時,在xml頁面內寫onclick來綁定點擊方法一樣,html用的也是這種方法,只是不同的是這裏面需要輸入的不止是一個方法名,而是window.變量名.方法名

方法名自不用說,至於什麽是變量名,先看下面的代碼

首先webView的初始化要改成如下代碼

     contentWebView = (WebView) findViewById(R.id.webview);
        // 啟用javascript
        contentWebView.getSettings().setJavaScriptEnabled(true);
        // 從assets目錄下面的加載html
        contentWebView.loadUrl("file:///android_asset/web.html");
        contentWebView.addJavascriptInterface(MainActivity.this,"android");

最後一行添加js接口的時候,後面的“android”就是之前說的變量名

那麽再往下,就需要定義這個方法了

   //由於安全原因 targetSdkVersion>=17需要加 @JavascriptInterface 
    //JS調用Android JAVA方法名和HTML中的按鈕 onclick後的別名後面的名字對應
    @JavascriptInterface
    public void startFunction(){

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this,"show",3000).show();

            }
        });
    }

    @JavascriptInterface
    public void startFunction(final String text){
        runOnUiThread(new Runnable() {

            @Override
            public void run() {
               new AlertDialog.Builder(MainActivity.this).setMessage(text).show();

            }
        });


    }

做到這,js就可以調用本地android中的方法了,這就實現了交互的過程

當然這裏的交互非常簡單,如果需求不一樣,還需要修改,例如調用js時使用evaluateJavascript()會使得網頁不刷新並且較為容易獲得返回值等等

這方面在這篇文章中講的很透徹,這裏也直接引用

Android:你要的WebView與 JS 交互方式 都在這裏了

android與js交互