热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WebView相关2--标题,增加header;native/H5JS调用

网上都有,也算是差不多被人写烂了的东西,正好之前用过了,放在这儿权当个笔记记录了吧。光一个Webview的内容,自己看起来还

网上都有,也算是差不多被人写烂了的东西,正好之前用过了,放在这儿权当个笔记记录了吧。

光一个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 &#61; new HashMap<>();
map.put("HTTP_VERSION",getVersion(this));//加载需要显示的网页
web_push.loadUrl(url, map);

需要注意的是&#xff0c;如果需要进行webview的内部跳转&#xff0c;每次请求前是需重新添加header的&#xff0c;试过不重新添加&#xff0c;新的请求是没有的。也比较简单&#xff0c;(上篇文章也提到的关于再这个 shouldOverrideUrlLoading也可以进行很多相关的url进行相关拦截处理的操作。不再赘述&#xff09;

webview.setWebViewClient(new WebViewClient() {&#64;Overridepublic boolean shouldOverrideUrlLoading (WebView view, String url){if (url.startsWith("http:www.badu")) {//可以进行相关操作&#xff0c;比如遇到XX就跳转到本地页面Intent xx&#xff1d;new Intent&#xff08;this&#xff0c;XXXX.class&#xff09;;startActivity(xx);return true;} else if {&#xff0f;&#xff0f;需要内部跳转的网页&#xff0c;添加headerHashMap map &#61; new HashMap<>();map.put("HTTP_VERSION", MyApp.getVersion(context));
//加载需要显示的网页view.loadUrl(url, map);return super.shouldOverrideUrlLoading(view, url);}}});

加上之前的给请求增加COOKIEs&#xff08;COOKIEs貌似也要给没个链接设置下&#xff09;&#xff0c;这样基础的网络请求相关的基本就算告一个小段落了。

BTW&#xff0c;关于内部跳转之后的退出&#xff0f;返回上一页&#xff0c;可以用

&#64;Override
public void onBackPressed() {if (web_push.canGoBack()) {if (web_push.getUrl().equals(url)) {
//url&#xff1a;进入时候的初始url&#xff0c;放这儿也就是做个多一个判断&#xff0c;现在看了看&#xff0c;貌似加不加都行super.onBackPressed();} else {web_push.goBack();}} else {super.onBackPressed();}
}


进行JS操作&#xff08;H5 JS调用本地native方法&#xff0c;本地调取JS方法获取相关信息&#xff09;&#xff1a;

也比较简单&#xff0c;网上也有无数现成的方法&#xff0c;基本都是注册个接口来进行处理&#xff0c;以常用的点击网页的按钮进行调用本地分享功能和本地调用JS代码获取信息进行分享两个功能来举例子

先写一个回调处理类&#xff1a;

public class JSInterface {private Activity context;private ShareOpen shareOpen;private String title&#61;"";private String content&#61;"";private String link&#61;"";private String img&#61;"";private String defLink&#61;"";public JSInterface(Activity context) {super();this.context &#61; context;}/*** shareOpen是分享相关的方法*//*** JS调用Android(Java)含参数的方法* &#64;param pic 图片地址* &#64;param link 分享地址* &#64;param tittle 分享标题* &#64;param content 分享的内容*/&#64;JavascriptInterfacepublic void js4Android(String pic, String link, String tittle, String content) {//Android代码逻辑shareOpen.startShare(context,pic,link,tittle&#43;"&#61;"&#43;content,"",false,"dream");}/*** 本地使用js代码之后的数据回传** &#64;param params 回调参数* &#64;param code 回调的类型*/&#64;JavascriptInterfacepublic void js4params(String params, int code) {if (TextUtils.isEmpty(params)) {YcLog.d("&#61;&#61;&#61;&#61;&#61;&#61;&#61;>", "params is null");} else {if (code &#61;&#61; 1) {YcLog.d("&#61;&#61;&#61;&#61;&#61;&#61;&#61;>111", params);title &#61; params;} else if (code &#61;&#61; 2) {YcLog.d("&#61;&#61;&#61;&#61;&#61;&#61;&#61;>222", params);img &#61; params;} else if (code &#61;&#61; 3) {link &#61; params;YcLog.d("&#61;&#61;&#61;&#61;&#61;&#61;&#61;>333", params);} else if (code &#61;&#61; 4) {YcLog.d("&#61;&#61;&#61;&#61;&#61;&#61;&#61;>444", params);content &#61; params;}else if(code&#61;&#61;5){YcLog.d("&#61;&#61;&#61;&#61;&#61;&#61;&#61;>555", params);defLink&#61;params;}else if (code&#61;&#61;6){YcLog.d("&#61;&#61;&#61;&#61;&#61;&#61;&#61;>666", params);if (!TextUtils.isEmpty(params)){title &#61; params;}}}if(TextUtils.isEmpty(title)){title&#61;context.getString(R.string.app_name);}if(TextUtils.isEmpty(content)){content&#61;context.getString(R.string.login_slogn);}if(TextUtils.isEmpty(link)){link&#61;defLink;}if(code&#61;&#61;7){shareOpen.startShare(context,img,link,title&#43;"&#61;"&#43;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() {&#64;Overridepublic void onReceiveValue(String value) {//此处为 js 返回的结果Toast.makeText(WebActivity.this, value.toString(), Toast.LENGTH_SHORT).show();YcLog.d("&#61;&#61;&#61;&#61;&#61;&#61;>", value);}});}private void getJS() {//获取隐藏域的相关信息&#xff0c;最后通过一个类型7做标志位置调用分享功能。webview.loadUrl("Javascript:window.js4Android.js4params(location.href,5)");webview.loadUrl("Javascript:window.js4Android.js4params(document.getElementById(&#39;shareDesc&#39;).value,4)");webview.loadUrl("Javascript:window.js4Android.js4params(document.getElementById(&#39;shareLink&#39;).value,3)");webview.loadUrl("Javascript:window.js4Android.js4params(document.getElementById(&#39;shareImg&#39;).value,2)");webview.loadUrl("Javascript:window.js4Android.js4params( document.getElementById(&#39;shareTitle&#39;).value,6)");webview.loadUrl("Javascript:window.js4Android.js4params(document.title,1)");webview.loadUrl("Javascript:window.js4Android.js4params(000,7)");
}





推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 标题: ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
author-avatar
xsf9507
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有