1.首先在項目下建一個assets目錄(右擊app->New->Folder->Assets Flolder),直接放在項目根目錄下和res目錄同級別(把所html,js,圖片,css等所有網頁相關放在這個目錄下)r
2.建一個test.html文件代碼如下
<html> <script> function callJS(arg){ document.getElementById('replaceme').innerHTML=arg; alert("arg="+arg); } //Android后台java會來調用它 </script> <body> <a href="#" onclick="window.alert('AlertfromJavaScript')"> alert調用toast</a><br> <a href="#" onclick="window.android.callAndroid('HellofromBrowser')"> js調用java方法</a><br> <a href="#" onclick="window.android.callAndroid222('HellofromBrowser2222','333')"> js調用java方法2</a> <!--//js通過自己定義“android"接口來調用java類中的方法,"android"可以改成任意的,但必須和java中設置的接口名一致--> <br /> <p id="replaceme"> </p> <body> </html>
3.layout文件如下
<WebView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/webView" android:layout_below="@+id/btnUrlShow" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="java調用js方法" android:id="@+id/bt4" android:layout_below="@+id/bt3" android:layout_alignLeft="@+id/bt3" android:layout_alignStart="@+id/bt3" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="用來顯示html調用的值" android:id="@+id/textView5" android:layout_centerVertical="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true"/>
4.activity代碼如下
public class WebViewActivity extends Activity { private Button sendRequest,bt4; private TextView responseText,textView5; private final Handler handler=new Handler();//只有用handel才能修改android控件的值 private class AndroidBridge //這個類中提供各種js可調用的方法。 { @JavascriptInterface public void callAndroid(final String arg) { handler.post(new Runnable(){ public void run() { Log.d("ZW", "calAndroid("+arg+")"); textView5.setText(arg); } }); } @JavascriptInterface public void callAndroid222(final String arg,final String arg2) { handler.post(new Runnable(){ public void run() { Log.d("zwzw", "callAndroid222("+arg+","+arg2+")"); textView5.setText(arg); } }); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view); textView5=(TextView)findViewById(R.id.textView5); webView = (WebView) findViewById(R.id.webView); webView.getSettings().setJavaScriptEnabled(true);//讓web可以運行js String url="file:///android_asset/test.html"; webView.loadUrl(url); webView.addJavascriptInterface(new AndroidBridge(), "android"); //將那個實例化的函數類設置為”android"的js接口這個。這里什么android名字前台js調用就用什么,比如這這里給名字為abc,html中調用就用onclick="window.abc.callAndroid(...." //覆蓋重寫html中js的alert方法,還可以覆蓋重寫別的方法,可以轉到定義去查。。 webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Log.d("ZW", "onJsAlert(" + view + "," + url + "," + message + "," + result + ")"); Toast.makeText(WebViewActivity.this, message, Toast.LENGTH_SHORT).show(); result.confirm(); return true; } });//設置可以被java截獲的js事件。 //點android控件調用js方法
bt4=(Button)findViewById(R.id.bt4);
bt4.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Log.d("ZW", "onClick(" + v + ")"); webView.loadUrl("javascript:callJS('hello from android')"); //java調用js的函數 } }); } }