Android开发之WebView组件的使用解析

在 Android 手机中内置了一款高性能 webkit 内核浏览器, SDK 中封装为一个叫做 WebView 组件。
WebView 类是 WebKit 模块 Java 层的视图类,( 所有需要使用 Web 浏览功能的Android应用程序都要创建该视图对象显示和处理请求的网络资源。目前,WebKit 模块支持 HTTP、HTTPS、FTP 以及 javascript 请求。
WebView 作为应用程序的 UI 接口,为用户提供了一系 列的网页浏览、用户交互接口,客户程序通过这些接口访问 WebKit 核心代码。 )

什么是 webkit
WebKit 是 Mac OS X v10.3 及以上版本所包含的软件框架(对 v10.2.7 及以上版本也可通过 软件更新获取) 同时,
WebKit 也是 Mac OS X 的 Safari 网页浏览器的基础。WebKit 是一个开源项目,主要由 KDE 的 KHTML 修改而来并且包含了一些来自苹果公司的一些组件。
传统上, WebKit 包含一个网页引擎 WebCore 和一个脚本引擎 JavaScriptCore,它们分别对应 的是 KDE 的 KHTML 和 KJS。
不过,随着 JavaScript 引擎的独立性越来越强,现在 WebKit 和 WebCore 已经基本上混用不分(例如 Google Chrome 和 Maxthon 3 采用 V8引擎,却仍然 宣称自己是 WebKit 内核) 。
这里我们初步体验一下在 android 是使用 webview 浏览网页,

SDK 的 Dev Guide 中有一个 在 WebView 的简单例子 。 在开发过程中应该注意几点: 1.AndroidManifest.xml 中必须使用许可"android.permission.INTERNET",否则会出 Web page not available 错误。
2.如果访问的页面中有 Javascript,则 webview 必须设置支持 Javascript。 webview.getSettings().setJavaScriptEnabled(true);
3.如果页面中链接, 如果希望点击链接继续在当前 browser 中响应, 而不是新开 Android 的系统browser 中响应该链接,必须覆盖 webview 的 WebViewClient 对象。
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; } });
4.如果不做任何处理,浏览网页,点击系统“Back”键,整个 Browser 会调用 finish()而结束自身,
如果希望浏览的网 页回退而不是推出浏览器,需要在当前 Activity 中处理并消费 掉该 Back 事件。


代码如下:

public boolean onKeyDown(int keyCode, KeyEvent event){ <BR> if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}

在tomcat上放一个漂亮页面
1.加载网页(加权限)
定义一个网址输入文本框,点按钮用webView打开这个网页
2.编写data字符串,webview.loadData(data,"text/html","UTF-8");
3.用dialog的setiem打开网址,前进,后退,放大,缩小,清历史。
4.用HTML定义开发界面。file:/android_asset/a.html


代码如下:

<script>
function loadurl(){ }
< /script>
< select name="">
<option value=""/>
<option value=""/>
< /select>
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setBuiltInZoomControls(true);
webview.loadUrl(file:///...);

5.js对话框(用chom..)


代码如下:

function openAlert(){
window.alert("");
}
function openConfirm(){
if(window.confirm("是否删除此信息?")){
window.location="myjs.html";//-------------------!!!
}
}
<input type="submit" value="警告" onClick="openAlert()">
< input type="submit" value="确认" onClick="openConfirm()">

java调js中的方法:


代码如下:

//在java中调用javascript方法要通过loadUrl()来进行,把要调用的方法作为loadUrl方法的字符串参数
settings.setJavaScriptEnabled(true);//设置在webview中可用js
webview.loadUrl("javascript:myprompt1()");

javascript中调java中的方法:(特别强调要用Android2.2版模拟器)


代码如下:

webview.addJavascriptInterface(new MyInterface(), "myobj");//第二步---注册在js中调用的对象名myobj
webview.loadUrl("file:///android_asset/test.html");
//第一步:定义要在js中调用的方法
class MyInterface{
public String getname(){
return "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
}
}

------------javascript中:-----


代码如下:

function myinterface(){
document.getElementById("myname").innerHTML = window.myobj.getname() ;
}

WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。
WebView有几个可以定制的点:
(1)设置WebChromeClient子类,WebChromeClient会在一些影响浏览器ui交互动作发生时被调用,比如WebView关闭和隐藏、页面加载进展、js确认框和警告框、js加载前、js操作超时、webView获得焦点等等,详见WebChromeClient
(2)设置WebViewClient子类,WebViewClient会在一些影响内容喧嚷的动作发生时被调用,比如表单的错误提交需要重新提交、页面开始加载及加载完成、资源加载中、接收到http认证需要处理、页面键盘响应、页面中的url打开处理等等,详见WebViewClient
(3)设置WebSettings类,其中包含多项配置。WebSettings用来对WebView的配置进行配置和管理,比如是否可以进行文件操作、缓存的设置、页面是否支持放大和缩小、是否允许使用数据库api、字体及文字编码设置、是否允许js脚本运行、是否允许图片自动加载、是否允许数据及密码保存等等,详见WebSettings
(4)设置addJavascriptInterface方法,将java对象绑定到webView中,以方便从页面js中控制java对象, 实现用本地java代码和html页面进行交互,甚至可以进行页面自动化。但如此做存在安全隐患,所以若设置了此方法,请确保webView的代码都是自己完成,详细使用addJavascriptInterface进行自动化见本文5使用addJavascriptInterface完成和js交互
1、back键控制网页后退
Activity默认的back键处理为结束当前Activity,webView查看了很多网页后,希望按back键返回上一次浏览的页面,这个时候我们就需要覆盖onKeyDown函数,告诉他如何处理,如下:


代码如下:

public boolean onKeyDown(int keyCode, KeyEvent event) {
if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
webView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}

其中webView.canGoBack()在webView含有一个可后退的浏览记录时返回true
webView.goBack();表示返回webView的上次访问页面
WebView(网络视图)能加载显示网页,可以将其视为一个浏览器。
网络内容:
1、LoadUrl直接显示网页内容(单独显示网络图片)
2、LoadData显示中文网页内容(含空格的处理)
APK包内文件:
1、LoadUrl显示APK中Html和图片文件
2、LoadData(loadDataWithBaseURL)显示APK中图片和文字混合的Html内容res/layout/main.xml
----------------------------------------------------------
当运行提示为web page not available时去清单文件中添加权限
<uses-permission android:name="android.permission.INTERNET"/>
URLUtil.isNetworkUrl(String uri)方法用来判断用户输入的URL是否有效,如无效则会显示一个Toast信息框来提醒用户输入正确的URL
----------------------------------------------------------
步骤:
1、在布局文件中声明WebView
2、在Activity中实例化WebView
3、调用WebView的loadUrl( )方法,设置WevView要显示的网页
4、为了让WebView能够响应超链接功能,调用setWebViewClient( )方法,设置 WebView视图
5、用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面
6、需要在AndroidManifest.xml文件中添加权限,否则出现Web page not available错误。
<uses-permission android:name="android.permission.INTERNET"/>
下面是具体的例子:
MainActivity.java


代码如下:

package com.android.webview.activity;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends Activity {
private WebView webview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webview = (WebView) findViewById(R.id.webview);
//设置WebView属性,能够执行Javascript脚本
webview.getSettings().setJavaScriptEnabled(true);
//加载需要显示的网页
webview.loadUrl("http://www.8way.com/");
//设置Web视图
webview.setWebViewClient(new HelloWebViewClient ());
}
@Override
//设置回退
//覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
webview.goBack(); //goBack()表示返回WebView的上一页面
return true;
}
return false;
}
//Web视图
private class HelloWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
}

main.xml


代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
在AndroidManifest.xml文件中添加权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.webview.activity"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

webview学习记录总结:
首先要在 manifest.main 文件中创建一个 webview,
然后再 activity 中定义这个 webview 然后 进行以下相关操作。
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 如果希望点击链接由自己处理,而不是新开 Android 的系统 browser 中响应该链接。
给 WebView添加一个事件监听对象( WebViewClient)并重写其中的一些方法:
shouldOverrideUrlLoading:对网页中超链接按钮的响应。当按下某个连接时 WebViewClient会调用这个方法,
并传递参数:按下的 url onLoadResource onPageStart onPageFinish onReceiveError onReceivedHttpAuthRequest
5、如果访问的页面中有 Javascript,则 webview 必须设置支持 Javascript ,否则显示空白页面。
Java 代码 webview.getSettings().setJavaScriptEnabled(true);
6、如果页面中链接,如果希望点击链接继续在当前 browser 中响应,而不是新开 Android 的系统 browser 中响应该链接,必须覆盖 webview 的 WebViewClient 对象: Java 代码 1.mWebView.setWebViewClient(new WebViewClient(){ 2. 3. 4. 5. 6. });
上述方法告诉系统由我这个 WebViewClient 处理这个 Intent,我来加载 URL。 点击一个链接的 Intent 是向上冒泡的,
shouldOverrideUrlLoading 方法 return true 表示我加载后这个 Intent 就消费了, 不再向上冒泡了。
7、 如果不做任何处理, 在显示你的 Brower UI 时, 点击系统“Back”键, 整个 Browser 会作为一个整体“Back" }
public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true;
到其他 Activity 中,而不是希望的在 Browser 的历史页面中 Back。

(0)

相关推荐

  • Android 实现WebView点击图片查看大图列表及图片保存功能

    在日常开发过程中,有时候会遇到需要在app中嵌入网页,此时使用WebView实现效果,但在默认情况下是无法点击图片查看大图的,更无法保存图片.本文将就这一系列问题的实现进行说明. 图示: 项目的知识点: 加载网页后如何捕捉网页中的图片点击事件: 获取点击的图片资源后进行图片显示,获取整个页面所有的图片: 支持查看上下一张的图片以及对图片缩放显示: 对图片进行保存: 其他:图片缓存的处理(不用每次都重新加载已查看过的图片) 项目代码结构: 前期准备(添加权限.依赖和混淆设置): 添加权限: <us

  • Android实现点击WebView界面中图片滑动浏览与保存图片功能

    一.实现需求 最近在公司的项目中遇到需求如下: 1.点击 WebView 页面的图片实现开启查看图片模式,即可以显示点击的图片,然后滑动显示下一张图片. 3.长按 WebView 页面图片弹出对话框可以选择保存长按的图片到本地相册. 拿到这个需求笔者第一反应是没做过 WebView 相关的交互,甚至分不清这个需求是否需要服务端配合完成 Java 与 JavaScript 的互相调用,一脸茫然. 遇到这种情况笔者的解决思路一般分两个方向: 1.找一个比较出名的客户端有类似功能的,然后 Google

  • Android使用WebView播放flash的方法

    本文实例讲述了Android使用WebView播放flash及判断是否安装flash插件的方法.分享给大家供大家参考.具体实现方法如下: 一.问题: 最近帮一个同学做一个项目,断断续续的一些知识点记录一下.一个页面中有一个WebView,用来播放swf,如果系统中未安装flash插件,必须提示用户到market中安装. 二.解决方法: 下面做一个demo,效果图如下: 图1: 图2: 图3: 首先布局文件,很简单: 复制代码 代码如下: <RelativeLayout xmlns:android

  • 解析Android中webview和js之间的交互

    1.android中利用webview调用网页上的js代码.Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true,,然后通过loadUrl就可以直接进行调用,如下所示:mWebView.getSettings().setJavaScriptEnabled(true);mWebView.loadUrl("javascript:test()"); 2. 网页上调用android中java代码的方法在网页中

  • Android开发实现webview中img标签加载本地图片的方法

    本文实例讲述了Android开发实现webview中img标签加载本地图片的方法.分享给大家供大家参考,具体如下: 在网上查了很多教程,感觉很麻烦,各种方法,最后实践很简单,主要是两步: WebSettings webSettings=webView.getSettings(); //允许webview对文件的操作 webSettings.setAllowUniversalAccessFromFileURLs(true); webSettings.setAllowFileAccess(true)

  • Android webview打开本地图片上传实现代码

    Webview打开本地图片选择器十分之麻烦,其在安卓系统3x 4x 5x上的行为都不同,处理也不同,所以之前差点崩溃.经过测试和完善,最终其在各个版本上都能完美工作. 直接上代码 package com.testandroid.webview; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AlertDialog; imp

  • Android中WebView图片实现自适应的方法

    本文实例讲述了Android中WebView图片实现自适应的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: WebSettings ws = tv.getSettings(); 加上这个属性后,html的图片就会以单列显示就不会变形占了别的位置 ws.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //让缩放显示的最小值为起始 webView.setInitialScale(5); // 设置支持缩放 webSettin

  • Android编程实现WebView自适应全屏方法小结

    本文实例讲述了Android编程实现WebView自适应全屏的方法.分享给大家供大家参考,具体如下: 第一种: settings.setUseWideViewPort(true); settings.setLoadWithOverviewMode(true); 第二种: WebSetting settings = webView.getSettings(); settings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); 把所有内容放在we

  • Android编程实现读取本地SD卡图片的方法

    本文实例讲述了Android编程实现读取本地SD卡图片的方法.分享给大家供大家参考,具体如下: private Bitmap getDiskBitmap(String pathString) { Bitmap bitmap = null; try { File file = new File(pathString); if(file.exists()) { bitmap = BitmapFactory.decodeFile(pathString); } } catch (Exception e)

  • android异步加载图片并缓存到本地实现方法

    在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出.针对上面遇到的两个问题,首先耗费流量我们可以将图片第一次加载上面缓存到本地,以后如果本地有就直接从本地加载.图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如大图片使用LRU缓存策略或懒加载缓存策略.今天首先介绍一下本地缓存图片. 首先看一下异步加载缓存本地代码: 复制代码 代码如下: public

  • android中webview控件和javascript交互实例

    当我们要实现丰富的图文混排效果的时候,我们一般会使用webview,这是一个功能十分强大的的控件,来看看官方的解释: 复制代码 代码如下: A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content within your Activity. It uses the WebKit

随机推荐