WebView中JS调用Android Method 遇到的坑整理
WebView是android中常用的一个组件,其作用是展示网页,并让网页和android app进行一些业务逻辑上的交互。
其坑无数,相信用过的都知道,一个一个来解决吧。
1.怎么互调:

<!DOCTYPE>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript">
function android(bl){
if(bl){
document.getElementById("ap").innerHTML= "是true啊参数传过来了"
}else{
document.getElementById("ap").innerHTML= "改变了段落的文字"
}
}
function self(){
document.getElementById("btn").innerHTML= "javascript改变按钮文字"
}
</script>
</head>
<body>
<div>
<p id="ap">这是一个段落</p>
<button onclick="window.hello.showAndroid()">点击Toast</button>
<button onclick="self()" id="btn">javascriptzi自己的方法</button>
</div>
</body>
</html>

上面是js代码 ,下面是android代码:

public class MyWebViewtest extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webviewtest_layout);
initView();
}
private void initView() {
final WebView webView = (WebView) findViewById(R.id.my_web);
webView.loadUrl("file:///android_asset/webviewtest.html");
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JiaoHu(),"hello");
Button btn = (Button) findViewById(R.id.get_js);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
webView.loadUrl("javascript:android(true)");
}
});
}
public class JiaoHu{
@JavascriptInterface
public void showAndroid(){
Toast.makeText(MyWebViewtest.this,"js调用了android的方法",Toast.LENGTH_SHORT).show();
}
}
}

js调用android方式: <button onclick="window.hello.showAndroid()">点击Toast</button>
hello指的是类(接口)的别名 ,在我们上面的代码中也就是JiaoHu类 , showAndroid()是方法名,所以android和js要约定好的就是 类的别名 以及 方法名 即可调用成功。
android调用js方式:webView.loadUrl("javascript:android(true)");
android()为js中定义好的一个方法名,我们可以在android代码中传入一个参数true,在js中便能接收到,执行 document.getElementById("ap").innerHTML= "是true啊参数传过来了" 这一句。
2.坑之一(webview中js的方法不能执行):
web组的同事在采用 ajax 框架请求后台数据的时候,我这里则无法显示,原因少了一句话:
webView.getSettings().setDomStorageEnabled(true); //很关键!!!!
这句代码让android能读取js的节点,也就可以执行了
3.坑之二(webView中h5变形记):
我们做的活动是类似于这样的

然鹅,当点击了输入框,弹出软键盘,变成这样的:

没错,妈的变形了(变形记),这个需要前端同事将window的高度设置为定长(之前height=100%)
var HEIGHT = $('body').height();
$(window).resize(function() {
$('.main').height(HEIGHT);
});
可以的,这个解决了。
坑之三(js中操作android的UI了 导致 java.lang.IllegalStateException: Calling View methods on another thread than the UI thread.at 异常):
这是最恶心的,没有之一,之前没遇到过。
我们活动中要集成umeng分享,分享到微信,分享到朋友圈都没有问题(更神奇的是做的时候还是ok的,提交给测试的时候就变卦了,日了狗了)。
涉及到一个操作UI的问题,那我们肯定要将js调用我们的代码放在UI线程中啊
runOnUiThread(new Runnable() {
@Override
public void run() {
// Code for WebView goes here
}
});
这个自然没问题,也就是要把我们注解的方法的内容放在UI线程中跑,但是你的 类 你的 接口 他不是Activity啊 没有runOnUiThread方法啊 。
急中生智,让我们的类 继承 Activity
public class FreeFlowInterface extends Activity
ok,现在就可以了,然后在这么一来

@JavascriptInterface
public void shareToFriend(){
runOnUiThread(new Runnable() {
@Override
public void run() {
Bitmap bitmap = drawableToBitmap(R.drawable.sharepic);
mShareController = UmengShareUtils.share(activity,mShareController,shareTitle,shareContent,targetUrl,bitmap);
}
});
}

坑真的不少,且行且小心。
WebView中JS调用Android Method 遇到的坑整理的更多相关文章
- PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码
PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码 看看新闻网>看引擎>开源产品 0人收藏此文章, 发表于8小时前(2013-09-06 00:39) ...
- WebView中Js与Android本地函数的相互调用
介绍 随着Html5的普及,html在表现力上不一定比原生应用差,并且有很强的扩展兼容性,所以越来越多的应用是采用Html与Android原生混合开发模式实现. 既然要实现混合开发,那么Js与Andr ...
- Xamarin Android Webview中JS调用App中的C#方法
参考链接:https://github.com/xamarin/recipes/tree/master/Recipes/android/controls/webview/call_csharp_fro ...
- WebView之js调用Android类的方法传递数据
1,具体的思路如下: 在android中写一个Activity,里面写一个webview,这个webview加载本地的一个html文件,显示这个网页,这个网页包括一个用户名和密码的输入框和两个按钮(只 ...
- [转]JS调用Android里面的方法,Android调用JS里面的方法
FROM : http://blog.csdn.net/hj563308597/article/details/45197709 Android WebView 在公司Android的开发过程中遇到一 ...
- js调用android本地java代码
js调用android本地java代码 当在Android上使用WebView控件开发一个Web应用时,可以创建一个通过Javascript调用Android端java代码的接口.也就是可以通过Jav ...
- JS调用Android、Ios原生控件
在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...
- C# winForm webBrowser页面中js调用winForm类方法(转)
有时我们在winform项目中嵌入了网页,想通过html页面调用后台方法,如何实现呢?其实很简单,主要有三部: 1.在被调用方法类上加上[ComVisible(true)]标签,意思就是当前类 ...
- CEF3中js调用delphi内部方法
2015-01-20修改:以下方法不适合delphi7,在CEF3源码中限制了delphi_14 up,对于被我误导的朋友说声抱歉 在CEF1中JS调用delphi的方法已经贴过:http://www ...
随机推荐
- .NET下使用 Seq结构化日志系统
前言 我们公司在日志管理方面一直没有统一,主要痛点有: 每个开发人员都是各用各的,存储日志的形式也是五花八门,如:本地文件,数据库,Redis,MongoDB 由于公司访问服务器要通过堡垒机,所以本机 ...
- 【Selenium2】【项目实战】
[public/login.py] from selenium import webdriverfrom selenium.webdriver.common.by import Byimport ti ...
- Vue--vux组件库
各种组件demo源码~ https://doc.vux.li/zh-CN/
- [转]C++中const、volatile、mutable的用法
原文:https://blog.csdn.net/imJaron/article/details/79657642 const意思是“这个函数不修改对象内部状态”. 为了保证这一点,编译器也会主动替你 ...
- 写给前端的Python依赖管理指北
概述 在Python的项目中,我们可以通过pip来安装依赖包,但是不像npm install,pip默认安装的依赖包会挂在全局上,不利于项目工程协作. 这时候需要一款类似npm的工具记录我们的项目依赖 ...
- 浅谈Nginx负载均衡与F5的区别
前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道“墙”,将请求分发到web服务器后,web服务器上的Nginx再进行处理,静态内容直接访问 ...
- 力扣(LeetCode)976. 三角形的最大周长
给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的.面积不为零的三角形的最大周长. 如果不能形成任何面积不为零的三角形,返回 0. 示例 1: 输入:[2,1,2] 输出:5 示例 2 ...
- 学习笔记49—matlab FDR校正
matlab自带函数mafdr,当ttest数较多时,可直接用[FDR, Q]=mafdr(P):但是Storey procedure在p值少于1000个时会崩溃,此时应改用BH FDR方法:mafd ...
- include
1. 自己写的文件都用:include "....." 2. 如果A类include了B,那么在主函数中,只用include A类,就可以使用B类了,但是此时不能再include ...
- PyMongo官方文档翻译——VNPY
PyMongo是MongoDB数据库的python模块 VNPY默认的数据库,没有采用SQL类型的数据库,而是采用No-Sql类型的MongoDB数据库, 对于想了解VNPY内部结构的童鞋,多多少少会 ...