android原生webview中调用JS方法并传递参数给JS遇到的问题
在使用webview时,需要给JS传递一个参数,之前前端同事把JS方法内容和html内容分离了,所以在使用下面的方法的时候一直显示方法未定义[INFO:CONSOLE(1)] "Uncaught ReferenceError: load is not defined", source: (1),后来把JS方法写到html里,这个方法就可以调用了,因为是第一次做这个问题,所以不知道有没有直接调用单独JS文件里的方法
webview不能够正常加载JS的问题可以看我的另一篇文章 http://blog.csdn.net/weixue9/article/details/78324737,调用Js方法并传递参数的具体步骤如下:
通过 WebViewClient 的方法shouldOverrideUrlLoading ()回调拦截 url
具体原理:
1.Android通过 WebViewClient 的回调方法shouldOverrideUrlLoading ()拦截 url
2.解析该 url 的协议
3.如果检测到是预先约定好的协议,就调用相应方法,即JS需要调用Android的方法
具体使用:
步骤1:在JS约定所需要的Url协议
JS代码:javascript.html,以.html格式放到src/main/assets文件夹里
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Carson_Ho</title>
<script>
function callAndroid(){
/*约定的url协议为:js://webview?arg1=111&arg2=222*/
document.location = "js://webview?arg1=111&arg2=222";
}
</script>
</head>
<!-- 点击按钮则调用callAndroid()方法 -->
<body>
<button type="button" id="button1" οnclick="callAndroid()">点击调用Android代码</button>
</body>
</html>
html5页面与android页面之间通过url传递参数
html5页面与android页面之间可以通过url传递参数,android将参数放在htm5的url ?后面,js获取url ?号后面的参数。
方法一:
<scrīpt>
/* 用途: 接收地直栏参数 如取id=1 */
urlinfo=window.location.href;
//获取当前页面的url
len=urlinfo.length;
//获取url的长度
offset=urlinfo.indexOf(
"?"
);
//设置参数字符串开始的位置
newsidinfo=urlinfo.substr(offset,len)
//取出参数字符串 这里会获得类似“id=1”这样的字符串
newsids=newsidinfo.split(
"="
);
//对获得的参数字符串按照“=”进行分割
newsname=newsids[0];
//得到参数名字,如id
newsid=newsids[1];
//得到参数值
</scrīpt>
方法二:
<script
>
function GetRequest()
{
var url = location.search; //获取url中"?"符后的字串
var theRequest = new Object();
if(url.indexOf("?") != -1)
{
var str = url.substr(1);
strs = str.split("&");
for(var i = 0; i < strs.length; i ++)
{
theRequest[strs[i].split("=")[0]]=unescape(strs[i].split("=")[1]);
}
}
return theRequest;
}
</script>
然后我们通过调用此函数获取对应参数值:
<script>
var Request=new Object();
Request=GetRequest();
var 参数1,参数2,参数3,参数N;
参数1=Request['参数1'];
参数2=Request['参数2'];
参数3=Request['参数3'];
参数N=Request['参数N'];
</script>
android中webview loadUrl(String url,Map header)方法和postUrl(String url,byte[] postData)方法同时使用问题;
首先说明 loadUrl(String url,Map header)是用于加载webview中添加请求头的方法
postUrl(String url,byte[] postData)是用于加载webview中添加请求体的方法
但是比较坑的是如果你想同时添加请求头和请求体这两个方法都不能用,并且android自带的webview中也没有提供方法,
android确实有些地方还不如苹果啊,苹果webview就有自带的方法,可以将请求头请求体都放到Request中。
在stackoverflow上搜索后有用其他第三方封装的http请求做的,但是比较麻烦,在这里说出我自己的处理方法,不一定适合所有人,
但是绝对简单粗暴,我用的就是 loadUrl(String url,Map header)方法,将自己的请求体拼接到url中
也就是url=url+"?body="+body;
然后用 loadUrl(String url,Map header)方法将url替换成带请求体的url,请求头就写成map格式,问题就解决了,需要做的就是让后台支持get方法请求。