关于android开发中JS与webview进行交互的文章网上已经很多,但是百度搜了一下关于源生代码向JS中传递返回值的问题说法五花八门,在此将项目中解决办法记录一下
public class MainActivity extends AppCompatActivity {
private static final String LOG_TAG = "WebViewDemo";
private WebView mWebView;
private Handler mHandler = new Handler();
@SuppressLint("JavascriptInterface")
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.activity_main);
mWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setSavePassword(false);
webSettings.setSaveFormData(false);
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
mWebView.setWebChromeClient(new MyWebChromeClient());
mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
mWebView.loadUrl("http://www.jz100.com/static/test.html");
}
final class DemoJavaScriptInterface {
DemoJavaScriptInterface() {
}
/**
* This is not called on the UI thread. Post a runnable to invoke
* loadUrl on the UI thread.
*/
@JavascriptInterface
public void clickOnAndroid(String test) {
Toast.makeText(MainActivity.this, test, Toast.LENGTH_SHORT).show();
}
@JavascriptInterface
public String GetLat()
{
return "123";
}
}
/**
* Provides a hook for calling "alert" from javascript. Useful for
* debugging your javascript.
*/
final class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d(LOG_TAG, message);
result.confirm();
return true;
}
}
}
在源生代码中调用webSettings.setJavaScriptEnabled(true)方法表示支持js脚本,然后在addJavascriptInterface中传入于js交互的方法类,在该类中写提供给JavaScript调用的方法,记住加上@JavascriptInterface注解,否则js还是无法识别。若想给js返回值,只需设置接口函数的回调值即可。
js的调用代码如下:
<html>
<script language="javascript">
var lat;
function initialize(){
lat = window.demo.GetLat();
}
</script>
<body οnlοad="initialize()">
<!-- Calls into the javascript interface for the activity -->
<a id="btn_test" onClick="window.demo.clickOnAndroid(lat)">
<div style="width:80px;
margin:0px auto;
padding:10px;
text-align:center;
border:2px solid #202020;" >
Click me!
</div>
</a>
</body>
</html>
在js中调用源生方法函数为window.demo.函数名,其中demo为mWebView.addJavascriptInterface方法中的第二个参数,若想获得返回值,只需接收其回调即可。