Android與JS互相呼叫
阿新 • • 發佈:2019-02-14
1、HTML頁面
<!doctype html> <html> <head> <meta charset="utf-8"> <title>無標題文件</title> <script> var i=0; function clickFun(){ var str =document.getElementById("name").value; document.getElementById("bt").value="Click Me"+i++; //alert(str); inJs.innerFun(str);//呼叫 java函式 } function setName(name){ document.getElementById("name").value=name;//等java 呼叫,修改html元素 } </script> </head> <body> <input type="text" id="name"> <input type="button" id="bt" value="Click Me" onClick="clickFun()"> </body> </html>
2、Activity
package com.example.app04; import java.util.Random; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.webkit.JavascriptInterface; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.TextView; public class MainActivity extends Activity { TextView tv; WebView wv; // Handler handler=new Handler(); Random r =new Random(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); wv =(WebView) findViewById(R.id.webView1); tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { handler.post(new Runnable() { @Override public void run() { //呼叫JS中的 函式,當然也可以不傳參 wv.loadUrl("javascript:setName('android產生的隨機數:"+r.nextInt(100)+"')"); } }); } }); // WebSettings setting =wv.getSettings(); setting.setJavaScriptEnabled(true); //執行js程式碼 // wv.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); //將Android物件,轉為 JS 可以 呼叫的 物件 wv.addJavascriptInterface(new InnerAndroid(), "inJs"); //載入本地 頁面 wv.loadUrl("file:///android_asset/index.html"); } //內部物件,修改介面 final class InnerAndroid{ @JavascriptInterface//api14以後必加 public void innerFun(final String str){ Log.i("Msg", "收到 引數 :"+str); handler.post(new Runnable(){ @Override public void run() { tv.setText(str); } }); } } }
3、佈局檔案
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <WebView android:id="@+id/webView1" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignLeft="@+id/tv" android:layout_below="@+id/tv" /> </RelativeLayout>
4、測試
js呼叫java,可以
java呼叫js,可以