网上都有,也算是差不多被人写烂了的东西,正好之前用过了,放在这儿权当个笔记记录了吧。
光一个Webview的内容,自己看起来还是有很多路要走啊。
native获取H5标题随时进行变更
比较简单,重写下onReceivedTitle就好了:
WebChromeClient wvcc = new WebChromeClient() {@Overridepublic void onReceivedTitle(WebView view, String title) {super.onReceivedTitle(view, title);if (!TextUtils.isEmpty(title)) {titletext.setText(title);} else {titletext.setText("");}}};
webview.setWebChromeClient(wvcc);
增加给webview的访问请求增加header:
HashMap
map.put("HTTP_VERSION",getVersion(this));//加载需要显示的网页
web_push.loadUrl(url, map);
需要注意的是,如果需要进行webview的内部跳转,每次请求前是需重新添加header的,试过不重新添加,新的请求是没有的。也比较简单,(上篇文章也提到的关于再这个 shouldOverrideUrlLoading也可以进行很多相关的url进行相关拦截处理的操作。不再赘述)
webview.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading (WebView view, String url){if (url.startsWith("http:www.badu")) {//可以进行相关操作,比如遇到XX就跳转到本地页面Intent xx=new Intent(this,XXXX.class);startActivity(xx);return true;} else if {//需要内部跳转的网页,添加headerHashMap
//加载需要显示的网页view.loadUrl(url, map);return super.shouldOverrideUrlLoading(view, url);}}});
加上之前的给请求增加COOKIEs(COOKIEs貌似也要给没个链接设置下),这样基础的网络请求相关的基本就算告一个小段落了。
BTW,关于内部跳转之后的退出/返回上一页,可以用
@Override
public void onBackPressed() {if (web_push.canGoBack()) {if (web_push.getUrl().equals(url)) {
//url:进入时候的初始url,放这儿也就是做个多一个判断,现在看了看,貌似加不加都行super.onBackPressed();} else {web_push.goBack();}} else {super.onBackPressed();}
}
进行JS操作(H5 JS调用本地native方法,本地调取JS方法获取相关信息):
也比较简单,网上也有无数现成的方法,基本都是注册个接口来进行处理,以常用的点击网页的按钮进行调用本地分享功能和本地调用JS代码获取信息进行分享两个功能来举例子
先写一个回调处理类:
public class JSInterface {private Activity context;private ShareOpen shareOpen;private String title="";private String content="";private String link="";private String img="";private String defLink="";public JSInterface(Activity context) {super();this.context = context;}/*** shareOpen是分享相关的方法*//*** JS调用Android(Java)含参数的方法* @param pic 图片地址* @param link 分享地址* @param tittle 分享标题* @param content 分享的内容*/@JavascriptInterfacepublic void js4Android(String pic, String link, String tittle, String content) {//Android代码逻辑shareOpen.startShare(context,pic,link,tittle+"="+content,"",false,"dream");}/*** 本地使用js代码之后的数据回传** @param params 回调参数* @param code 回调的类型*/@JavascriptInterfacepublic void js4params(String params, int code) {if (TextUtils.isEmpty(params)) {YcLog.d("=======>", "params is null");} else {if (code == 1) {YcLog.d("=======>111", params);title = params;} else if (code == 2) {YcLog.d("=======>222", params);img = params;} else if (code == 3) {link = params;YcLog.d("=======>333", params);} else if (code == 4) {YcLog.d("=======>444", params);content = params;}else if(code==5){YcLog.d("=======>555", params);defLink=params;}else if (code==6){YcLog.d("=======>666", params);if (!TextUtils.isEmpty(params)){title = params;}}}if(TextUtils.isEmpty(title)){title=context.getString(R.string.app_name);}if(TextUtils.isEmpty(content)){content=context.getString(R.string.login_slogn);}if(TextUtils.isEmpty(link)){link=defLink;}if(code==7){shareOpen.startShare(context,img,link,title+"="+content,"",false,"dream");}}}
Activity中webview的相关设置
Button shareButton&#xff1b;bt_share.setOnClickListener(new View.OnClickListener() {&#64;Overridepublic void onClick(View v) {web_push.post(new Runnable() {//印象中写这个是为了等待js加载完成&#xff0c;不写估计也行&#64;Overrideif (Build.VERSION.SDK_INT <19) {
//API在19以后会有不同的调用方式&#xff0c;我都用的是19之前的。。。这里只是写出来表示可以作区分&#xff0c;
//因为个人感觉19之后的一个方法回调string回来有点局限性&#xff0c;对于js代码要求较高 getJs();} else {getJS(); } });}});webview.setWebChromeClient(wvcc);&#xff0f;&#xff0f;别忘记加上这个&#xff0c;不然js脚本就没法之行了JSInterface jsInterface &#61; new JSInterface(context);
webview.addJavascriptInterface(jsInterface, "js4Android");//添加到webview//需要执行的JS代码&#xff0c;js代码也可以是一行&#xff0c;也可以是js的一个复杂的函数
private void getJs() {if (Build.VERSION.SDK_INT >&#61; Build.VERSION_CODES.KITKAT) {webview.evaluateJavascript("Javascript:var a&#61;&#39;aaa&#39;;var b&#61;&#39;bbb&#39;; return b;",new ValueCallback
}