Android WebView JS 交互 以及 传各种类型到JS函数

最近闲着没事干,公司有自己的安卓APP,平常测试页面JS与公司APP交互比较麻烦,突发奇想自己写一个APP来实现公司APP与页面JS的交互功能。

第一步:让自己的APP有访问网络的权限,在XXXManifest.xml加入下句代码

<uses-permission android:name="android.permission.INTERNET" />

第二步:在Activity 类文件中编写与JS交互的相关代码

@SuppressLint({ "JavascriptInterface", "SetJavaScriptEnabled" })// 设置JS访问类,要加上此标记
@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);

	wb_main = (WebView) findViewById(R.id.wb_main);
	wb_main.setWebChromeClient(new WebChromeClient());// 让 JS alert 生效
	wb_main.setWebViewClient(new WebViewClient() {// 打开链接不调用系统浏览器
		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			return false;
		}
	});
	wb_main.getSettings().setDefaultTextEncodingName("utf-8");// 设置编码
	wb_main.getSettings().setJavaScriptEnabled(true);// 支持js
	wb_main.setBackgroundColor(Color.argb(0, 0, 0, 0));// 设置背景颜色透明
	wb_main.addJavascriptInterface(new JSHandler(getBaseContext()), "js_handler");// 设置本地调用对象及其JS访问名称
	wb_main.loadUrl("file:///android_asset/demo.html");// 载入asset文件夹里面的页面
}

开放给JS访问类的编写

public class JSHandler {
	private Context mContxt;

	public JSHandler(Context mContxt) {
		this.mContxt = mContxt;
	}

	@JavascriptInterface // sdk17版本以上加上注解
	public void TestAcessJavaOK1() {
		Toast.makeText(mContxt, "TestAcessJavaOK1", Toast.LENGTH_LONG).show();
	}
        <pre name="code" class="java">        @JavascriptInterface // sdk17版本以上加上注解
	public void TestAcessJavaOK2(String str) {
		Toast.makeText(mContxt, "TestAcessJavaOK2"+str, Toast.LENGTH_LONG).show();
	}

}
 
第三步:测试是否成功访问,html页面写了两个JS函数用来测试 

function TestAccessJava(){
     js_handler.TestAcessJavaOK1();
}
function TestAccessJava(){
     js_handler.TestAcessJavaOK2('just test');
}
 

以上代码完成了JS访问Java的测试。

第四步:接下来是Java访问页面里面的JS函数。我们在Html页面在写两个函数,一个JS函数的参数是字符串类型,还有一个JS函数的参数是Json类型:

function TestAccessJsOK1(data) {
        alert(data);
}
function TestAccessJsOK2(data) {
        var temp = '';
        for (var i = 0; i < data.length; i++) {
            temp += data[i]["name"] + ':' + data[i]["age"] + '|';
        }
        document.getElementById('ap').value = temp;
}

我们在layout文件中添加两个按钮,并在Activity类文件中添加点击事件代码编写,

btn1.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		wb_main.loadUrl("javascript:TestAccessJsOK1('just test!')");
	}
});
btn2.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
        String strData="[{\"name\":\"tester1\",\"age\":\"18\"},{\"name\":\"tester2\",\"age\":\"19\"},{\"name\":\"tester3\",\"age\":\"20\"}]";
        String strJS="javascript:var data=eval('" + strData + "');TestAccessJsOK2(data)";
		wb_main.loadUrl(strJS);
	}
});
一开始我以为WebView.loadUrl()只能加载页面,调用页面JS可能是用WebView的其他方法,百度了一下才发现也可以调用页面JS,而且还可以执行JS语句,可以预先对JS参数的实现。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值