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 遇到的坑整理的更多相关文章

  1. PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码

    PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码 看看新闻网>看引擎>开源产品 0人收藏此文章, 发表于8小时前(2013-09-06 00:39) ...

  2. WebView中Js与Android本地函数的相互调用

    介绍 随着Html5的普及,html在表现力上不一定比原生应用差,并且有很强的扩展兼容性,所以越来越多的应用是采用Html与Android原生混合开发模式实现. 既然要实现混合开发,那么Js与Andr ...

  3. Xamarin Android Webview中JS调用App中的C#方法

    参考链接:https://github.com/xamarin/recipes/tree/master/Recipes/android/controls/webview/call_csharp_fro ...

  4. WebView之js调用Android类的方法传递数据

    1,具体的思路如下: 在android中写一个Activity,里面写一个webview,这个webview加载本地的一个html文件,显示这个网页,这个网页包括一个用户名和密码的输入框和两个按钮(只 ...

  5. [转]JS调用Android里面的方法,Android调用JS里面的方法

    FROM : http://blog.csdn.net/hj563308597/article/details/45197709 Android WebView 在公司Android的开发过程中遇到一 ...

  6. js调用android本地java代码

    js调用android本地java代码 当在Android上使用WebView控件开发一个Web应用时,可以创建一个通过Javascript调用Android端java代码的接口.也就是可以通过Jav ...

  7. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  8. C# winForm webBrowser页面中js调用winForm类方法(转)

      有时我们在winform项目中嵌入了网页,想通过html页面调用后台方法,如何实现呢?其实很简单,主要有三部:   1.在被调用方法类上加上[ComVisible(true)]标签,意思就是当前类 ...

  9. CEF3中js调用delphi内部方法

    2015-01-20修改:以下方法不适合delphi7,在CEF3源码中限制了delphi_14 up,对于被我误导的朋友说声抱歉 在CEF1中JS调用delphi的方法已经贴过:http://www ...

随机推荐

  1. js为什么返回两个对象字符串 objcet objcet ?

    js中两个使用 toString() 对有个有对象的数组进行操作时,为什么返回两个对象字符串 objcet objcet ? [{}].toString(); 返回 "[object Obj ...

  2. JavaScript——执行环境、变量对象、作用域链

    前言 这几天在看<javascript高级程序设计>,看到执行环境和作用域链的时候,就有些模糊了.书中还是讲的不够具体.通过上网查资料,特来总结,以备回顾和修正. 目录: EC(执行环境或 ...

  3. Lintcode415-Valid Palindrome-Medium

    Given a string, determine if it is a palindrome, considering only alphanumeric(字母和数字) characters and ...

  4. repr() 和 str() 函数

    这两个函数都是可以用来将值转换成字符串的. 函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式. 结果是:

  5. 转 代码修改buildoption

    using System;using System.IO;using UnityEditor;using UnityEngine; public class BuildPlayer : Scripta ...

  6. 下载安装 Android sdk

    下载地址: https://www.androiddevtools.cn/ 选择sdk 选择版本 将解压出的整个文件夹复制或者移动到 your sdk 路径/platforms文件夹,然后打开SDK ...

  7. hashtable详解

    hashtable也比称作哈希表,键值对或者关联数组 1. 先引用using System.Collections;命名空间 用于处理和表现key/value的键值对,其中key通常用来快速查找,同时 ...

  8. docker-compose在dockerfile更新后自动更新image

    比如在dockerfile里需要新安装包 形如 加一行 RUN pip3 install XXX 之后,希望docker-compose能更新镜像, 然后启动容器 只需要启动时使用 --build即可 ...

  9. python sshtunnel 简单介绍

    背景,公司的很多服务包括数据库访问都需要通过跳板机访问,为日常工作及使用带来了麻烦,特别数python直接操作数据更是麻烦了,所以一直想实现python 通过跳板机访问数据库的操作. 安装 pip3. ...

  10. ajax和iframe区别

    ajax和iframe https://segmentfault.com/a/1190000011967786 ajax和iframe的区别 1.都是局部刷新 2.iframe是同步的,而ajax是异 ...