Android web交互方式
第一、Android获取web特定内容
- (1)使用三方工具Jsoup来抓取标签数据
- 使用方法:获取整个页面-> 抓取特定的标签节点->获取里面的值
例子:
Document document = Jsoup.connect(url).get();
if(document.select("#share_title").size() > 0){
htmlInputBean.setTitle(document.select("#share_title").get(0).attr("value"));
}
- (2)弊端:
- 此方法只能获取页面静态加载的数据
例子;页面加载过程中获取接口数据加载到页面中,这类型的数据获取不到。
- (3)赋值
- 使用方法:获取整个页面->抓取特定的标签节点->赋予特定的值
例子:
Document document = document.connect(url).get();
//通过类名获取到一组Elements,获取一组中第一个element并设置其html
Elements elements = document.getElementsByClass("loadDesc");
elements.get(0).html("<p>加载完成</p>");
//通过ID获取到element并设置其src属性
Element element = document.getElementById("imageView");
element.attr("src","file:///android_asset/dragon.jpg");
//通过类名获取到一组Elements,获取一组中第一个element并设置其文本
elements = document.select("p.hint");
elements.get(0).text("您好,我是龙猫军团!");
//获取进行处理之后的字符串并重新加载
String body = document.toString();
webView.loadDataWithBaseURL(null, body, "text/html", "utf-8", null);
第二、Android调用web特定方法
- (1)通过webview.loadUrl javascript来调用页面中写
例子:
这是网页代码
<html>
<head>
........
<script>
function showMsg(){
alert("hello world!");
}
function showHelp(){
alert("我是帮助回调");
}
........
</script>
</head>
<body>
........
这是Android调用方式
mBtn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mWebView.loadUrl("javascript:showMsg()");
}
});
- (2)webview中注入javascript
- (1)将js文件转成字符串,在页面加载完成后,注入文件
- (2)向页面中添加<script>
标签,注入js文件
第一种:
URL url = new URL("http://www.rayray.ray/ray.js");
in = url.openStream();
byte buff[] = new byte[1024];
ByteArrayOutputStream fromFile = new ByteArrayOutputStream();
FileOutputStream out = null;
do {
int numread = in.read(buff);
if (numread <= 0) {
break;
}
fromFile.write(buff, 0, numread);
} while (true);
String wholeJS = fromFile.toString();
@Override
public void onPageFinished(WebView view, String url)
{
super.onPageFinished(view, url);
webview.loadUrl("javascript:" + wholeJS);
}
第二种:
String js = "var newscript = document.createElement(\"script\");";
js += "newscript.src=\"http://www.123.456/789.js\";";
js += "newscript.onload=function(){xxx();};"; //xxx()代表js中某方法
js += "document.body.appendChild(newscript);";
@Override
public void onPageFinished(WebView view, String url)
{
super.onPageFinished(view, url);
webview.loadUrl("javascript:" + js);
}
第三、web获取Android特定内容
暂无
第四、web调用Android特定方法
- 将要被web调用的方法封装到指定的类中,将方法注入
JavascriptInterface
,最后在加载时,添加到webview中。
例子:
原生代码
public class JavaScriptObject {
Context mContxt;
@JavascriptInterface //sdk17版本以上加上注解
public JavaScriptObject(Context mContxt) {
this.mContxt = mContxt;
}
public void fun1FromAndroid(String name) {
Toast.makeText(mContxt, name, Toast.LENGTH_LONG).show();
}
public void fun2(String name) {
Toast.makeText(mContxt, "调用fun2:" + name, Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化
initViews();
//设置编码
mWebView.getSettings().setDefaultTextEncodingName("utf-8");
//支持js
mWebView.getSettings().setJavaScriptEnabled(true);
//设置背景颜色 透明
mWebView.setBackgroundColor(Color.argb(0, 0, 0, 0));
//设置本地调用对象及其接口
mWebView.addJavascriptInterface(new JavaScriptObject(mContext), "myObj");
//载入js
mWebView.loadUrl("file:///android_asset/test.html");
}
web代码
<body>
<a>js中调用本地方法</a>
<script>
function funFromjs(){
document.getElementById("helloweb").innerHTML="HelloWebView,i'm from js";
}
var aTag = document.getElementsByTagName('a')[0];
aTag.addEventListener('click', function(){
//调用android本地方法
myObj.fun1FromAndroid("调用android本地方法fun1FromAndroid(String name)!!");
return false;
}, false);
</script>
<p></p>
<div id="helloweb">
</div>
</body>