文档章节

android webView使用方法

QGlaunch
 QGlaunch
发布于 2015/06/17 15:52
字数 1124
阅读 63
收藏 2
点赞 0
评论 0

在开发过程中应该注意几点: 
1.AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。
2.如果访问的页面中有Javascript,则webview必须设置支持Javascript。
webview.getSettings().setJavaScriptEnabled(true); 

3.如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象。

方法/步骤

  1. [java] view plaincopyprint?
    mWebView.setWebViewClient(new WebViewClient(){

    public boolean shouldOverrideUrlLoading(WebView view, String url) {

    view.loadUrl(url);

    return true;

    }

    });

    mWebView.setWebViewClient(new WebViewClient(){

    public boolean shouldOverrideUrlLoading(WebView view, String url) {

    view.loadUrl(url);

    return true;

    }

    }); 

  2. 4.如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。


    [java] view plaincopyprint?
    public boolean onKeyDown(int keyCode, KeyEvent event) {

    if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {

    mWebView.goBack();

    return true;

    }

    return super.onKeyDown(keyCode, event);

    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {

    if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {

    mWebView.goBack();

    return true;

    }

    return super.onKeyDown(keyCode, event);


  3. 下一步让我们来了解一下android中webview是如何支持javascripte自定义对象的,在w3c标准中js有 window,history,document等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使用js就可以 为所欲为了。
    看一个实例:


    [java] view plaincopyprint?
    view plaincopy to clipboardprint?

    public class WebViewDemo extends Activity {

    private WebView mWebView;

    private Handler mHandler = new Handler();

    public void onCreate(Bundle icicle) {

    super.onCreate(icicle);

    setContentView(R.layout.webviewdemo);

    mWebView = (WebView) findViewById(R.id.webview);

    WebSettings webSettings = mWebView.getSettings();

    webSettings.setJavaScriptEnabled(true);

    mWebView.addJavascriptInterface(new Object() {

    public void clickOnAndroid() {

    mHandler.post(new Runnable() {

    public void run() {

    mWebView.loadUrl("javascript:wave()");

    }

    });

    }

    }, "demo");

    mWebView.loadUrl("file:///android_asset/demo.html");

    }

    }

    public class WebViewDemo extends Activity {

    private WebView mWebView;

    private Handler mHandler = new Handler();

    public void onCreate(Bundle icicle) {

    super.onCreate(icicle);

    setContentView(R.layout.webviewdemo);

    mWebView = (WebView) findViewById(R.id.webview);

    WebSettings webSettings = mWebView.getSettings();

    webSettings.setJavaScriptEnabled(true);

    mWebView.addJavascriptInterface(new Object() {

    public void clickOnAndroid() {

    mHandler.post(new Runnable() {

    public void run() {

    mWebView.loadUrl("javascript:wave()");

    }

    });

    }

    }, "demo");

    mWebView.loadUrl("file:///android_asset/demo.html");

    }


  4. 我们看addJavascriptInterface(Object obj,String interfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName(demo),作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 javascript:window.demo访问到绑定的java对象了。来看看在html中是怎样调用的。www.cdtarena.com

    [html] view plaincopyprint?
    <html>

    <mce:script language="javascript"><!--

    function wave() {

    document.getElementById("droid").src="android_waving.png";

    }

    // --></mce:script>

    <body>

    <a onClick="window.demo.clickOnAndroid()">

    <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br>

    Click me!

    </a>

    </body>

    </html>

    <html>

    <mce:script language="javascript"><!--

    function wave() {

    document.getElementById("droid").src="android_waving.png";

    }

    // --></mce:script>

    <body>

    <a onClick="window.demo.clickOnAndroid()">

    <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br>

    Click me!

    </a>

    </body>

    </html> 
    这样在javascript中就可以调用java对象的clickOnAndroid()方法了,同样我们可以在此对象中定义很多方法(比 如发短信,调用联系人列表等手机系统功能。),这里wave()方法是java中调用javascript的例子。
    这里还有几个知识点:
    1)为了让WebView从apk文件中加载assets,Android SDK提供了一个schema,前缀为"file:///android_asset/"。WebView遇到这样的schema,就去当前包中的 assets目录中找内容。如上面的"file:///android_asset/demo.html" 
    2)addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用 Handler的目的。

  5. 总结:
    1、添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。
    2、在要Activity中生成一个WebView组件:WebView webView = new WebView(this);
    3、设置WebView基本信息:
    如果访问的页面中有Javascript,则webview必须设置支持Javascript。
    webview.getSettings().setJavaScriptEnabled(true); 
    触摸焦点起作用
    requestFocus();
    取消滚动条
    this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
    4、设置WevView要显示的网页:
    互联网用:webView.loadUrl("http://www.google.com"); 
    本地文件用:webView.loadUrl("file:///android_asset/XX.html"); 本地文件存放在:assets文件中
    5、如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。
    给WebView添加一个事件监听对象(WebViewClient) 
    并重写其中的一些方法
    shouldOverrideUrlLoading:对网页中超链接按钮的响应。
    当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url 
    onLoadResource 
    onPageStart 
    onPageFinish 
    onReceiveError
    onReceivedHttpAuthRequest
    6、如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。
    覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。

    [java] view plaincopyprint?
    public boolean onKeyDown(int keyCoder,KeyEvent event){

    if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){

    webview.goBack(); //goBack()表示返回webView的上一页面

    return true;

    }

    return false;


本文转载自:http://jingyan.baidu.com/article/64d05a0298502dde54f73b6c.html

共有 人打赏支持
QGlaunch
粉丝 4
博文 59
码字总数 11843
作品 0
朝阳
Android Hybrid开发:这是一份详细 & 全面的WebView学习攻略

前言 现在很多里都内置了Web网页(),比如说很多电商平台,淘宝、京东、聚划算等等,如下图 那么这种该如何实现呢?其实这是里一个叫组件实现 今天,我将献上一份全面 & 详细的 攻略,含具体...

Carson_Ho ⋅ 前天 ⋅ 0

Android WebView:这是一份 详细 & 易懂的WebView学习攻略(含与JS交互、缓存构建等)

前言 现在很多里都内置了Web网页(),比如说很多电商平台,淘宝、京东、聚划算等等,如下图 那么这种该如何实现呢?其实这是里一个叫组件实现 今天,我将献上一份全面 & 详细的 攻略,含具体...

Carson_Ho ⋅ 05/21 ⋅ 0

Android WebView:这是一份全面 & 详细的WebView学习指南

前言 现在很多里都内置了Web网页(),比如说很多电商平台,淘宝、京东、聚划算等等,如下图 那么这种该如何实现呢?其实这是里一个叫组件实现 今天,我将献上一份全面 & 详细的 攻略,含具体...

carson_ho ⋅ 04/19 ⋅ 0

使用Kotlin:让Android与JS交互的详解

先来说说什么是JS交互: 说的俗一点就是通过我们项目中的控件来调用HTML里的JS代码,也可以通过JS来调用项目中的代码。 Android与JS之间的桥梁就是WebView了,我们是通过WebView来实现他们的...

富江___ ⋅ 06/11 ⋅ 0

yubo_725/FlutterOSC

FlutterOSC 基于Google Flutter的开源中国客户端,支持Android和iOS。GitHub戳这里 关于Flutter Android扫码下载APK 说明 由于开源中国的openapi只提供了基于webview或浏览器的oauth认证方式...

yubo_725 ⋅ 05/08 ⋅ 0

[译] 通过安全浏览保护 WebView

原文地址:Protecting WebView with Safe Browsing 原文作者:Nate Fischer 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:androidxiao 校对者:jasonxia23 由软件工...

Android_开发者 ⋅ 06/16 ⋅ 0

Android界面跳转时候的生命周期

今天在开发的时候碰到一个坑。关于两个界面跳转的时候,生命周期顺序的问题。 场景模拟:比如我们有两个Activity。第一个界面展示排行榜,第二个界面是游戏(H5游戏)。我们玩游戏玩完一局以后...

tianshuai4317618 ⋅ 04/18 ⋅ 0

Android中使用WebView

现在很多移动端的应用,大多数都采用混合开发,也就是安卓原生控件加上我们的html代码 当然,要使用html的东西,android提供了一个控件,也就是WebView 那我们一起来看看WebView的使用吧 首先...

月夜中徘徊 ⋅ 05/15 ⋅ 0

腾讯X5WebView集成2018-05-15

工作中经常偶尔会用到H5网页来加载页面,使用原生的Android的WebView可以加载,但是当网页内容比较多的时候,需要等待很久才能加载完,加载完后用户才能看到网页中的内容,这样用户需要等很久...

林灬 ⋅ 05/15 ⋅ 0

android:X5WebView首次初始化X5内核耗时,会产生卡顿现象的解决办法

集成腾讯的X5,一般都是在application中进行初始化,不过有一个现象就是第一次启动都睡有一小会产生了UI卡顿,一开始利用IntentService进行后台线程进行初始化,但还是会产生卡顿现象,不过官...

胜_弟 ⋅ 05/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea 整合 vue 启动

刚学习Vue 搭建了一个项目 只能命令启动 Idea里面不会启动 尝试了一下修改启动的配置 如下: 1.首先你要保证你的package.json没有修改过 具体原因没有看 因为我改了这个name的值 就没办法启动...

事儿爹 ⋅ 28分钟前 ⋅ 0

数据仓库技术概述(一看就是架构师写的,对我极其有用)

ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、交互转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于...

gulf ⋅ 29分钟前 ⋅ 0

redis在windows环境的后台运行方法

在后台运行,首先需要安装redis服务,命令为 redis-server.exe --service-install redis.windows.conf --loglevel verbose 启动,命令为 redis-server --service-start 停止,命令为 redis-...

程序羊 ⋅ 31分钟前 ⋅ 0

比特币现金开发者提出新的交易订单规则

本周,四位比特币现金的四位开发者和研究员:Joannes Vermorel(Lokad),AmaurySéchet(比特币ABC),Shammah Chancellor(比特币ABC)和Tomas van der Wansem(Bitcrust)共同发表了一篇关...

lpy411 ⋅ 35分钟前 ⋅ 0

vue获取input输入框的数据

用惯了jQuery,突然使用vue感觉很不习惯,有很多不同的地方,感觉是两个不同的思想来写前端的代码。jQuery是使用选择器($)选取DOM对象,对其进行赋值、取值、事件绑定等操作。而Vue则是通过...

王子城 ⋅ 37分钟前 ⋅ 0

竟然这就是面向对象的游戏设计?!

从程序角度考虑,许多 JavaScript 都基于循环和大量的 if/else 语句。在本文中,我们可了解一种更聪明的做法 — 在 JavaScript 游戏中使用面向对象来设计。本文将概述原型继承和使用 JavaSc...

柳猫 ⋅ 42分钟前 ⋅ 2

git cmd git bash

刚用到了Git,看到windows环境下有两个命令输入窗口 第一个是可视化图形界面,第二个是CMD,第三个是Bash。 Git中的Bash是基于CMD的,在CMD的基础上增添一些新的命令与功能。所以建议在使用的...

东东笔记 ⋅ 44分钟前 ⋅ 0

分布式系统CAP和Base

1、分布式系统 1.1 简介 由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。分布式系统是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的...

xixingzhe ⋅ 55分钟前 ⋅ 0

查看磁盘占用情况

记一次jenkins构建失败的问题 Build step 'Send build artifacts over SSH' changed build result to UNSTABLE 网上查资料都没明确表明是什么错,回忆之前处理这样的问题。第一时间想到的是不...

ManderSF ⋅ 56分钟前 ⋅ 0

数据库管理提速:SQL解析的探索与应用

前言: SQL解析是一项复杂的技术,一般都是由数据库厂商来掌握,当然也有公司专门提供SQL解析的API。SQL解析与优化是属于编译器范畴,和C语言等其他语言的解析没有本质的区别。其中分为词法分...

java高级架构牛人 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部