PART_0    侃在前面的话

WebView是Android提供给我们用来载入网页的控件。功能非常强大。我们经常使用的手机淘宝。手机京东的Androidclient里面大量使用到了WebView。可是使用WebView比使用其它是更加耗电的,那为什么淘宝和京东还是要使用WebView作为APP里的部分,首先大家知道,淘宝,京东等在移动技术还不热的时候就有了一套完好的网页系统,所以使用WebView能够直接使用之前的逻辑。省时省力省钱。并且作为电商,每天的内容都是不同的。所以大家要及时更新。放在我们client来做肯定是不行的,你不能让用户一天下一个版本号吧?并且也不能拿我们程序当狗使啊,一天一个版本号。谁受得了?

PART_1    WebView基本使用

使用WebView非常easy。接下来我们就细细道来。

1. 得到WebView能够通过findViewById()的方法得到,也能够使用new WebView()的方式得到。所以得到WebView是第一步(废话,不得到WebView。你上哪去显示?)

2. 得到了WebView后,那就简单了,随便找个能够载入的链比方“http://www.baidu.com”,使用webView.loadUrl("http://www.baidu.com");就得到我们想要载入的界面。假设想载入我们存放在本地的html文件,比方assets里面。能够使用这个路径:file:///android_asset/xxx.html。

3. 得到了我们想要的界面后,发现假设我们点击当中的button并没不论什么效果,由于默认情况下WebView是不支持javascript的。所以我们要在代码里设置:getSettings().setJavaScriptEnabled(true);

设置了这个以后,页面是不能缩放的。加入这个能够是页面缩放:getSettings().setBuiltInZoomControls(true);

4. 上面点击有效果了,可是发现点击之后,并非在我们当前的WebView视图中进行转跳,事实上这个也好理解。你让人家转跳,可是你又拿着当前的WebView,那它能怎么转跳?所以人家就跟系统请求浏览器去跳转了。假设你的功能刚好是这个。那一切OK。功能实现了。可是假设你的功能不是这,所以得想办法解决啊,怎么解决?看以下:

wv.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
view.loadUrl(url);
return true;
}
});

代码非常easy懂。view.loadUrl(url)就是让WebView载入新的url。以下呢?以下返回true的意思是我就在当前的webView中转跳。

PART_2    WebView返回和获取网页标题

经过上面的那些,事实上我们发现了一个问题,如何回退到我们上个页面?由于我们发现,仅仅要转跳后,按返回键是回不到我们上个url的,仅仅会结束掉当前的Activity,所以这里我们就要复写按键事件了,例如以下:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (wv.canGoBack()) {
wv.goBack();
return true;
}
}
return super.onKeyDown(keyCode, event);
}

(注解:wv就是WebView的实例)

好。上面的返回也写好了,可是有个问题。怎么样获取到当前页面的标题?这里事实上谷歌早就提供了方法,例如以下:

wv.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
MainActivity.this.setTitle(title);
super.onReceivedTitle(view, title);
}
});

获取到标题以后,我这里是将标题设置到ActionBar上面去了,非常easy。可是非常有用

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

次奥,看完你一定会说,MD,回退的时候标题根本没有换回来啊?是的。怎样解决呢?看以下:

wv.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
view.loadUrl(url);
return false;
} @Override
public void onPageFinished(WebView view, String url) {
setTitle(view.getTitle());
super.onPageFinished(view, url);
}
});

看到onPageFinished这种方法了么,看完以后,你一定会跳起来说一句。原来获取title,能够这样。那我事实上全然能够不用上面的方法setWebChromeClient()的方法。

推荐篇文章看了你就大致知道为什么了:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=542884

PART 3     js与android交互

首先写一个简单的html页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>互调JS</title>
<script type="text/javascript">
function test() {
try {
window.external.callApp("afterChosen", 1059);
} catch(e) {
document.getElementById("content").innerHTML = "call fail!"
}
} function afterChosen(){
document.getElementById("content").innerHTML = "callback success!";
}
</script>
</head>
<body>
<p id="content">最開始的数据</p>
<input type="button" value="点击调用app" onclick="test()" />
</body>
</html>

非常easy,就是点击了button以后调用test()方法,然后在test()方法中在调用android中的callApp函数。可是为了使得js里面的代码可以正确调用到我们的方法,我们须要加一段这种代码:

wv.addJavascriptInterface(this, "external");

这里的this代表的是MainActivity.this,然后后面的參数跟我们js代码里写的window.external.callApp()要一致。然后我们在实现callApp方法:

@JavascriptInterface
public void callApp(final String funcName, final int n) {
wv.post(new Runnable() {
public void run() {
wv.loadUrl("javascript:" + funcName + "()");
}
});
}

这块要注意,我们的webview是一个单独的线程中运行的,假设你直接在UI线程中调用wv.loadUrl("javascript:" + funcName + "()")是会抛异常的,不信你能够试试。。

。wv.post就是将以下运行的代码post到webview所在的线程中,这样就能够顺利的运行了。

回调js函数是要遵循一定的格式的。否则是调不动的,格式非常easy就是在我们要调用的函数前面加上:
javascript:




看看最后的效果:



OK。 这篇文章就介绍到这里!

期待我的下一篇文章。绝对会让你大吃一惊。

WebView具体介绍的更多相关文章

  1. Android控件之WebView

    如何在Android应用中打开Web网站呢?谷歌为我们提供了解决方案,现在就让我们一起看一下WebView控件吧. 为了方便总结,就以实现下面这个效果为主线,进行总结: 首先我们先看一下它的布局文件吧 ...

  2. Android之webview详解

    文章大纲 一.webview基本介绍1.什么是webview2.为什么要使用webview3.webview基本操作 二.webview高级使用1.WebView状态2.资源加载3.WebView加载 ...

  3. React Native - 网页组件(WebView)的使用详解

    一.WebView组件介绍 使用 WebView 组件我们可以通过 url 来加载显示一个网页,也可以传入一段 html 代码来显示.下面对其主要属性和方法进行介绍.   1,属性介绍 source: ...

  4. android WebView详解,常见漏洞详解和安全源码

    这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析.  转载请注明出处:http://blog.csdn.net/se ...

  5. 关于 WebView 知识点的详解

    什么是 WebView WebView 是手机中内置了一款高性能 webkit 内核浏览器,在 SDK 中封装的一个组件.没有提供地址栏和导航栏, WebView 只是单纯的展示一个网页界面.在开发中 ...

  6. 关于 WebView 的一些笔记

    什么是 WebView WebView 是手机中内置了一款高性能 webkit 内核浏览器,在 SDK 中封装的一个组件.没有提供地址栏和导航栏, WebView 只是单纯的展示一个网页界面.在开发中 ...

  7. 重新想象 Windows 8.1 Store Apps 系列文章索引

    [源码下载] [重新想象 Windows 8 Store Apps 系列文章] 重新想象 Windows 8.1 Store Apps 系列文章索引 作者:webabcd 1.重新想象 Windows ...

  8. android 常用资料

    网上收集保存的一些常用的android资料,写得都比较不错,和大家分享下,共同学习: _ android ListView美化.docx androidshape.docx android_textv ...

  9. Win10系列:C#应用控件基础18

    WebView控件 使用WebView控件可以在应用中添加一个简易的网页浏览器窗口,将指定地址的网页内容显示出来,并可以通过WebView控件所提供的方法.属性及事件,实现如页面导航.HTML文本解析 ...

随机推荐

  1. 网络协议之NAT穿透

    NAT IPv4地址只有32位,最多只能提供大致42.9亿个唯一IP地址,当设备越来越多时,IP地址变得越来越稀缺,不能为每个设备都分配一个IP地址.于是,作为NAT规范就出现了.NAT(Networ ...

  2. Mysql建表语句

    create table messages( id int unsigned primary key auto_increment, sender varchar(64) not null, gett ...

  3. sql中多层循环示例(有游标)

    在需求处理中,我们会遇到需要通过SQL多层循环来处理的问题.如:A表中有8条数据,B表中有10条数据,需要实现A表中的每1条数据对应B表中的10条数据,最后就有了80条数据,从而实现一对多的关系.那如 ...

  4. Android中Xposed框架篇-微信实现本地视频发布到朋友圈功能

    微信非常庞大,还好有一些强大的工具,下面就来总结收获的知识. 一.使用adb shell dumpsys activity top命令快速定位页面 二.使用Jadx进行方法跟踪时候如果发现没有结果,可 ...

  5. 《Android源码设计模式》--原型模式

    No1: 原型模式使用场景: 1)类初始化需要消耗非常多的资源,这个资源包括数据.硬件资源等,通过原型复制避免这些消耗 2)通过new产生一个对象需要非常繁琐的数据准备货访问权限,这是可以使用原型模式 ...

  6. CodeForces - 831A Unimodal Array 模拟

    A. Unimodal Array time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  7. hdu-4027线段树练习

    title: hdu-4027线段树练习 date: 2018-10-10 18:07:11 tags: acm 算法 刷题 categories: ACM-线段树 # 概述 这道线段树的题可以说是我 ...

  8. (视频)asp.net core系列之k8s集群部署视频

    0.前言 应许多网友的要求,特此录制一下k8s集群部署的视频.在录制完成后发现视频的声音存在一点瑕疵,不过不影响大家的观感. 一.视频说明 1.视频地址: 如果有不懂,或者有疑问的欢迎留言.视频分为两 ...

  9. 删除或修改eclipse中svn的账号密码

    由于eclipse没有自带的管理svn账号的功能,我也没有找到相关的插件,要是有朋友知道的话也可以跟我说下哦!以下是关于自己手动去删除eclipse 软件的 svn账号,以便切换项目的时候去更换svn ...

  10. HTML基础-DAY1

    HTML基础 Web的本质就是利用浏览器访问socket服务端,socket服务端收到请求回复数据提供给浏览器进行渲染显示. import socket def main(): sock = sock ...