2014
02.03
02.03
在android项目中,我们使用webview将我们自己或他人的web应用嵌入到我们开发的android应用中。
通常我们在嵌入html网页的同时往往会用到javascript。我们需要java和javascript进行函数互相调用。安卓官网上已经介绍了二者之间基本的调用方法。下面讲一下java如何调用javascript有返回值的函数,并得到返回值。
1. 首先用ADT新建一个android工程。
2. 修改layout布局文件activity_main.xml。内容如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" tools:context=".MainActivity" android:orientation="vertical"> <WebView android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="200dp"/> <LinearLayout android:layout_width="fill_parent" android:layout_height="35dp" android:orientation="horizontal"> <EditText android:id="@+id/edit1" android:layout_width="50dp" android:layout_height="fill_parent"/> <TextView android:text="+" android:layout_width="30dp" android:layout_height="fill_parent"/> <EditText android:id="@+id/edit2" android:layout_width="50dp" android:layout_height="fill_parent"/> <TextView android:text="=" android:layout_width="30dp" android:layout_height="fill_parent"/> <TextView android:id="@+id/sum" android:layout_width="50dp" android:layout_height="fill_parent"/> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="50dp" android:orientation="horizontal"> <Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:onClick="clickSumBtn" android:text="sum calculation"/> </LinearLayout> </LinearLayout>
2. 修改MainActivity类。
import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { private WebView myWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myWebView = (WebView) findViewById(R.id.webview); //开启js WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); myWebView.setWebChromeClient(new MyWebChromeClient()); myWebView.loadUrl("file:///android_asset/hello.htm"); } public void clickSumBtn(View view){ EditText editText1 = (EditText)findViewById(R.id.edit1); EditText editText2 = (EditText)findViewById(R.id.edit2); String str1 = editText1.getText().toString(); String str2 = editText2.getText().toString(); String str = "javascript:alert(sum(" + str1 + "," + str2+ "))"; myWebView.loadUrl(str); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } final class MyWebChromeClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { TextView sum = (TextView)findViewById(R.id.sum); sum.setText(message); result.confirm(); return true; } } }
3. 在assets目录下新建文件hello.htm。内容如下:
<html> <head> <script type="text/javascript"> function sum(v1, v2){ return v1+v2; } </script> </head> <body> hello, world! </body> </html>
说明:
我们在安卓布局layout文件里定义了一个加法运算的界面。我们输入2个数后,java调用javascript求和函数计算两数之和,最后需要将结果返回给java。
这里我们定义了一个内部类MyWebChromeClient,它继承了WebChromeClient。我们覆盖了onJsAlert方法。我们通过调用myWebView.loadUrl(“javascript:alert(js函数(参数))”);的方式,在onJsAlert方法里捕获到了js函数的返回值。
这种方法的缺点是会影响到正常情况下使用alert方法。