最近项目中经常使用Html5而Android与JS调用经常会用到,这里记录一下,测试系统5.0以上。
这里先贴一下源码
Activity:
package jwzhangjie.com.webviewandjs;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView)findViewById(R.id.webView);
initWebView();
}
private void initWebView(){
//设置编码
webView.getSettings().setDefaultTextEncodingName("utf-8");
//支持js
webView.getSettings().setJavaScriptEnabled(true);
//设置监听事件
webView.setWebViewClient(new JieWewViewClient());
//设置本地调用对象及其接口
webView.addJavascriptInterface(new JavaScriptObject(getApplicationContext()), "toAndroid");
//载入js
webView.loadUrl("file:///android_asset/index.html");
}
public void javaCallJsNoParams(View view){
webView.loadUrl("javascript:javaCallJsNoParamsMethod()");
}
public void javaCallJsHasParams(View view){
webView.loadUrl("javascript:javaCallJsHasParamsMethod('" + 123 + "')");
}
public class JavaScriptObject {
Context mContxt;
public JavaScriptObject(Context mContxt) {
this.mContxt = mContxt;
}
@JavascriptInterface //sdk17版本以上加上注解
public void jsCallJavaNoParams() {
Toast.makeText(mContxt, "Js调用Java方法(无参)", Toast.LENGTH_LONG).show();
}
@JavascriptInterface //sdk17版本以上加上注解
public void jsCallJavaHasParams(String params) {
Toast.makeText(mContxt, "Js调用Java方法(有参):" + params, Toast.LENGTH_SHORT).show();
}
}
class JieWewViewClient extends WebViewClient{
/**
* 如果紧跟着
* webView.loadUrl("file:///android_asset/index.html");
* 调用Js中的方法是不起作用的,必须页面加载完成才可以
*/
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
webView.loadUrl("javascript:javaCallJsHasParamsMethod('" + 123 + "')");
}
}
}
html:
<!DOCTYPE HTML>
<HTML>
<HEAD>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
</HEAD>
<BODY>
<div>
<input type="text" id="showText" style="width:100%;height:100px;margin-bottom:10px" readonly>
<input type="button" οnclick="jsCallJavaNoParamsMethod()" value="Js调用Java方法(无参)">
<input type="button" οnclick="jsCallJavaHasParamsMethod('成功了')" value="Js调用Java方法(有参)">
</div>
</BODY>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript">
function javaCallJsNoParamsMethod(){
$('#showText').val("Java调用js方法,无参数");
}
function javaCallJsHasParamsMethod(params){
$('#showText').val("Java调用Js方法,有参数:"+params);
}
function jsCallJavaNoParamsMethod(){
toAndroid.jsCallJavaNoParams();
}
function jsCallJavaHasParamsMethod(params){
toAndroid.jsCallJavaHasParams(params);
}
</script>
</HTML>
界面:
注意点:
1、Android系统17以及以上,js调用java需要在方法上面加入@JavascriptInterface
2、不能在加载html页面的下面直接调用js方法,应该在WebViewClient的onPageFinished里面加载,原则就是必须html加载完毕后,才能调用js中的方法。
源码:http://download.csdn.net/download/jwzhangjie/9020941