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 ... 
随机推荐
- multiple definition of `qMain(int, char**)'
			QT C++ 我上一分钟运行地好好的,下一分钟就无法通过编译了.查了半天发现在IDE自动生成的项目文件.pro中 main竟然包含了两遍.我对这表示很无语,我完全是通过IDE来操作,却产生一些我不易察 ... 
- jQuery中的$(window).load()与$(document).ready()以及jquery $(document).ready() 与window.onload的区别
			大多数jQuery实例或教程都告诉我们绑定我们的jQuery代码到$(document).ready事件.虽然$(document).ready 事件在大多数情况下都OK,但是它的解析顺序是在文档准备 ... 
- CSDN-markdown编辑器语法——字体、字号与颜色
			Markdown是一种可以使用普通文本编辑器编写的标记语言,通过类似HTML的标记语法,它可以使普通文本内容具有一定的格式.但是它本身是不支持修改字体.字号与颜色等功能的! CSDN-markd ... 
- vs 2013 编译cocos2d-x-3.9
			下载地址:链接: https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ 提取码: p1pb 下载完成后,解压 进入build 目录 使用vs 2013 打开工 ... 
- var_export
			var_export可以将一个数组转为一个字符串,以符合PHP的代码风格,输出者展示一个字符串的内容. 多用于展示php代码结构,调试代码. <?php // 场合多用于展示php代码结构,调试 ... 
- eclipse里安装SVN插件的两种方式
			eclipse里安装SVN插件,一般来说,有两种方式: 直接下载SVN插件,将其解压到eclipse的对应目录里 使用eclipse 里Help菜单的“Install New Software”,通过 ... 
- R 的内部机制
			在前面的章节中,我们已经学习了 R 语言的基础功能,并且了解了如何运用向量.矩阵.列表和数据框表示不同形式的数据,以及用内置函数解决简单的问题.但是仅仅了解这些功能并不能解决所有问题.现实中的数据分析 ... 
- 分布式系统的唯一id生成算法你了解吗?
			在分库分表之后你必然要面对的一个问题,就是id咋生成? 因为要是一个表分成多个表之后,每个表的id都是从1开始累加自增长,那肯定不对啊. 举个例子,你的订单表拆分为了1024张订单表,每个表的id都从 ... 
- 一篇好文之Android数据库 GreenDao的完全解析
			数据库GreenDao.jpg 之前在开发过程中,数据库基本上会使用Litepal或者SQlite自己写,最近换新环境,公司原先使用的数据库就是GreenDao,在各种情况的作用下,准备了解下Gree ... 
- SpringBoot 文件上传、下载、设置大小
			本文使用SpringBoot的版本为2.0.3.RELEASE 1.上传单个文件 ①html对应的提交表单 <form action="uploadFile" method= ... 
