android-webview

1.1 Android WebView 一些基本概念

开发过程中应该注意:
1.AndroidManifest.xml 中必须使用许可android.permission.INTERNET.否则会出Web page not available错误
2.如果访问的页面中有javascript,则WebView必须设置支持javascript
WebView.setSettings().setJavaScriptEnable(true);
3.如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖webView的WebViewClient对象
wv1.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub view.loadUrl(url); return true; } });
4.如果不做任何处理,浏览网页,点击系统back键,整个browser会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if ((keyCode == KeyEvent.KEYCODE_BACK) && wv1.canGoBack()) { wv1.goBack(); return true; } return super.onKeyDown(keyCode, event); }

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

public class MainActivity extends Activity { private WebView wv1; private Handler mHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); wv1 = (WebView) findViewById(R.id.wv); WebSettings webSettings = wv1.getSettings(); webSettings.setJavaScriptEnabled(true); wv1.addJavascriptInterface(new Object() { public void clickOnAndroid() { mHandler.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub wv1.loadUrl("javascript: wave()"); } }); } }, "demo"); wv1.loadUrl("file:///android_asset/demo.html"); } }
在assets目录下加入demo.html文件
<html> <mce: script language="javascript"> </mce: script> <body> <a onClick="window.demo.clickOnAndroid()"> <img id="droid" src="ic_launcher.png" mce_src="ic_launcher.png"/><br> Click me! </a> </body> </html>
效果:

Paste_Image.png

我们来看看addJavascriptInterface(Object object, String name)这个方法

Paste_Image.png

该方法将一个Java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName(demo),作用域是Global,这样初始化后,在WebView加载的页面中就可以通过javascript:window.demo访问到绑定的java对象了

javascript中就可以调用java对象的clickOnAndroid()方法了,同样,我们可以在此对象中定义很多方法,

注意:

1.为了让WebView从apk文件中加载assets,Android SDK提供了一个schema,前缀为“file://android_asset/",WebView遇到这样 的schema就去当前包中的assets目录中找内存

2.addJavascriptInterface方法中要绑定的java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用handler的目的。

1.2 Android WebView 组件的使用详情

网络内容

  • loadUrl 直接显示网页内容(单独显示网络图片)
  • loadData 显示中文网页内容(含空格的处理)
    APK 包含文件
  • LoadUrl显示APK中Html和图片文件
  • LoadData(loadDataWithBaseURL)显示APK中图片和文字混合的Html内容

package com.example.demo2; import java.net.URLEncoder; import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; import android.webkit.WebView; @SuppressLint("JavascriptInterface") public class MainActivity extends Activity { final String mimeType = "text/html"; final String encoding = "utf-8"; WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = (WebView) findViewById(R.id.wv); webView.getSettings().setJavaScriptEnabled(true); webHtml(); webImage(); localHtmlZh(); localHtmlBlankSpace(); localHtmlImage(); }

 /***
 * 显示本地图片和文字混合的html内容
 */
private void localHtmlImage() {
    // TODO Auto-generated method stub
    try {
        String data = "测试本地图片和文字混合显示,这是APK里的图片";
        // SDK1.5本地文件处理(不能显示图片)
        // webView.loadData(URLEncoder.encode(data, encoding), mimeType,
        // encoding);
        // SDK1.6及以后版本
        webView.loadData(data, mimeType, encoding);
        // 本地文件处理(能显示图片)
        webView.loadDataWithBaseURL("about: blank", data, mimeType,
                encoding, "");
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
/**
 * 中文显示(空格的处理)
 */
private void localHtmlBlankSpace() {
    // TODO Auto-generated method stub
    try {
        String data = "测试含有空格的Html数据";
        webView.loadData(URLEncoder.encode(data, encoding), mimeType,
                encoding);
        webView.loadData(data, mimeType, encoding);
        webView.loadData(
                URLEncoder.encode(data, encoding).replaceAll("+", " "),
                mimeType, encoding);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
/**
 * 中文显示
 */
private void localHtmlZh() {
    // TODO Auto-generated method stub
    try {
        String data = "测试含有中文的html数据";
        // WebView.loadData(data, mimeType, encoding);
        webView.loadData(URLEncoder.encode(data, encoding), mimeType,
                encoding);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}   
/**
 * 直接网络图片显示
 */
private void webImage() {
    // TODO Auto-generated method stub
    try {
  webView.loadUrl("http://h.hiphotos.baidu.com/image/w%3D230/sign=648d06b8a41ea8d38a227307a70b30cf/38dbb6fd5266d0165e532f2b952bd40735fa356e.jpg");
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
/*
 * 直接显示网页
 */
private void webHtml() {
    // TODO Auto-generated method stub
    try {
        webView.loadUrl("http://www.baidu.com");
    } catch (Exception ex) {
        ex.printStackTrace();
    }
  }   
}

2.1 Android编写简单的WebView

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容