android中webView和html中js的交互


現在hybrid app比較火,使用起來也比較方便。
android中通過webView加載顯示url,通常會遇到一些問題,比如android和網頁界面的交互。比如定位的功能,需要手機提供給js一個經緯度。下面有一個簡單交互的例子


public class MainActivity extends Activity {
private WebView webview;

private String URL = "http://192.168.1.224:8080/app/aaa.html";// 這是你要訪問你html文件的存放地址,我這個是放在appache中的word文件夾下的login.html文件
private Handler mHandler = new Handler();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

webview = (WebView) findViewById(R.id.webView1);

WebSettings webset = webview.getSettings();

webset.setJavaScriptEnabled(true);// 啓用JS腳本,這個一定要加上,不然就調用不了,無法交互,因爲調用的方法寫在js裏面

//	 webset.setUseWideViewPort(true); // 上下自適應屏幕

webset.setLoadWithOverviewMode(true); // 自適應屏幕

webview.setWebChromeClient(new WebChromeClient() {

});

webview.addJavascriptInterface(new JsObject(), "jsObject");

webview.loadUrl(URL);

}


public class JsObject {

@JavascriptInterface
//@JavascriptInterface必須寫上,不寫上也實現不了交互
//這個方法不是在ui線程中的。可以通過handler.post發送到ui線程執行。可以用Thread.currentThread.getId查看線程的id
public void getMessage(String name, String pwd) {

// TODO Auto-generated method stub
mHandler.post(new Runnable() {
    public void run(){
        System.out.println("===" + "name:" + name + "---pwd:" + pwd);

        Toast.makeText(MainActivity.this, "user="+name+"==pw="+pwd, Toast.LENGTH_SHORT).show();
    }
});


}

}


}



html文件代碼

<!DOCTYPE html>

  <html>
    <head>
      <script>
        function login(){
          var th = document.form;
          var user = th.user.value;
          if(user==""){
            alert("請輸入用戶名!");
          }else{
            var name = th.user.value;
            var pwd = th.pwd.value;
            var name2 = jsObject.getMessage(name,pwd);
          }
        }
      </script>
    </head>
    <body>
      <form name='form' method='post' class='form' action=''>
        <table id='login_table'>
          <tr>
            <td>
              <span>賬號:</sapn>
            </td>
            <td>
              <input type='text' class='usr' name='user' value=''/>
            </td>
            <td></td>
          </tr>
          <tr>
            <td>
              <span>密碼:</sapn>
            </td>
            <td>
              <input type='password' class='psw' name='pwd' value=''/>
            </td>
            <td></td>
          </tr>
          <tr>
            <td></td>
            <td>
              <input type="file" value="上傳圖片" />
              <button class='denglu' οnclick="login()">登陸</button>
              <button class='clear'>清空</button>
            </td>
            <td></td>
          </tr>
        </table>
      </form>
    </body>
  </html>

可以把上面的html放在tomcat的webapps目錄下,也可以直接放在android項目的assets文件夾中,這個時候讀取的url就是webview.loadUrl(file:///android_asset/aaa.html);


點擊登錄的時候,會調用js的login方法,在login方法中先會判斷用戶名是不是爲空,爲空就彈出提示,不爲空的話就獲取輸入的用戶名和密碼,然後再調用android的getmessage(),把用戶名和參數的方法傳遞到android,在手機端就能彈出提示的toast,實現了webView和js的交互。這裏是js調用了android中提供的方法


這裏只是實現了js調用android的方法,如何實現android調用js的代碼
在android需要調用js代碼的地方加上一句webview.loadUrl("javascript:setLocation()");
其中的setLocation()方法就是js中的一個function

需要注意的地方:
被js調用的android方法,需要加一個@JavascriptInterface標緻,每個方法都必須加。
webView設置需要加上webset.setJavaScriptEnabled(true);啓用js腳本
Android中被js調用的方法不是在ui線程中執行的,可以通過Thread.currentThread.getId()來查看是否在同一個線程中。一些操作需要通過handler.post發送出到ui線程中來才能處理。

通過上面的方法。可以知道,要想獲得經緯度的話,先點擊一個按鈕,通過js調用android中的方法獲取經緯度,然後android獲取到經緯度之後必須再通知js,告訴他這個經緯度我已經拿到了。也就是在獲得經緯度後再調用js中的function方法,在這個function方法中再次調用android中的另一個有返回值的方法來返回這個經緯度給js





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章