Android开发之WebView详解

http://www.android100.org/html/201408/03/50085.html
概述:
一个显示网页的视图。这个类是你可以滚动自己的Web浏览器或在你的Activity中简单地显示一些在线内容的基础。它使用了WebKit渲染引擎来显示网页,包括向前和向后导航的方法(通过历史记录),放大和缩小,执行文本搜索等。
需要注意的是:为了让你的应用能够使用WebView访问互联网和加载网页,你必须添加Internet的权限在Android Manifest文件中:

类结构:
java.lang.Object
? android.view.View
? android.view.ViewGroup
? android.widget.AbsoluteLayout
? android.webkit.WebView
常用方法:
Public Methods WebSettings getSettings()
获取设置WebView的WebSettings对象。
void setWebViewClient(WebViewClient client)
设置将接收各种通知和请求的WebViewClient。
void setWebChromeClient(WebChromeClient client)
设置chrome处理。
说明:
WebSettings getSettings()获取设置WebView的WebSettings对象。
WebSettings常用方法:
方法说明:
setAllowFileAccess 启用或禁用WebView访问文件数据
setBlockNetworkImage 是否显示网络图像
setBuiltInZoomControls 设置是否支持缩放
setCacheMode 设置缓冲的模式
setDefaultFontSize 设置默认的字体大小
setDefaultTextEncodingName 设置在解码时时候用的默认编码
setFixedFontFamily 设置固定使用的字体
setJavaScriptEnabled 设置是否支持Javascript
setLayoutAlgorithm 设置布局方式
setLightTouchEnabled 设置用鼠标激活被选项
setSupportZoom 设置是否支持变焦
void setWebViewClient(WebViewClient client) 设置将接收各种通知和请求的WebViewClient。

WebViewClient 常用方法:
方法说明:
doUpdateVisitedHistory 更新历史记录
onFormResubmission 应用程序重新请求网页数据
onLoadResource 加载指定地址提供的资源
onPageFinished 网页加载完毕
onPageStarted 网页开始加载
onReceivedError 报告错误信息
onScaleChangedWebView 发生改变
shouldOverrideUrlLoading 控制新的连接在当前WebView中打开
void setWebChromeClient(WebChromeClient client) 设置chrome处理。
WebChromeClient常用方法:
方法说明:
onCloseWindow 关闭WebView
onCreateWindow 创建WebView
onJsAlert 处理Javascript中的Alert对话框
onJsConfirm 处理Javascript中的Confirm对话框
onJsPrompt 处理Javascript中的Prompt对话框
onProgressChanged 加载进度条改变
onReceivedlcon 网页图标更改
onReceivedTitle 网页Title更改
onRequestFocus WebView显示焦点

自定义WebView,你可以添加你自己的行为:
创建和设置WebChromeClient子类。当一些可能影响浏览器的用户界面发生了,例如,进度更新和JavaScript警报送到这里(见调试任务)调用这个类。创建和设置WebViewClient子类。当影响内容呈现的事情发生是调用这个类,例如,错误或表单提交。您也可以拦截的URL加载到这里(通过shouldOverrideUrlLoading())。修改WebSettings,如以setJavaScriptEnabled()方式启用JavaScript。将Java对象通过addJavascriptInterface(Object, String)方法注射到WebView。 这方法允许您将Java对象注入到一个页面的JavaScript上下文,这样他们可以通过JavaScript访问的页面。
下面是一个更加复杂的例子,显示错误处理, 设置和进展通知:

 // Let's display the progress in the activity title bar, like the
 // browser appdoes.
 getWindow().requestFeature(Window.FEATURE_PROGRESS);
 webview.getSettings().setJavaScriptEnabled(true);
 final Activity activity = this;
 webview.setWebChromeClient(new WebChromeClient() {
   public void onProgressChanged(WebView view, int progress) {
     //Activities and WebViews measure progress with different scales.
     //The progress meter will automatically disappear when we reach 100%
     activity.setProgress(progress * 1000);
   }
 });
 webview.setWebViewClient(new WebViewClient() {
   public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
     Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
   }
 });
 webview.loadUrl("http://developer.android.com/"); 

缩放:
可以通过 设置 WebSettings.setBuiltInZoomControls(boolean) ,启用内置缩放。
注意:使用缩放,如果不是高度或宽度设置为WRAP_CONTENT可能会导致不确定的行为,应该避免。
Cookie 和窗口管理:
出于显而易见的安全原因,您的应用程序都有自己的缓存,cookie存储等,它不共享浏览器应用程序的数据。
默认情况下,通过HTML请求打开新的窗口将被忽略。这是确切的它们是被JavaScript打开还是被目标链接打开。您可以自定义您的WebChromeClient提供自己的行为打开多个窗口,并使用你想要的任何方式渲染它们。
WebView中构建Web应用程序:
如果你想提供一个Web应用程序(或只是一个网页)作为客户端应用程序的一部分,你可以使用WebView做到这一点。WebView类是Android的View类的一个扩展,它可以让你显示网页作为你的活动布局的一部分。它不包括一个完全开发的Web浏览器的任何功能,如导航控件或一个地址栏。所有的WebView默认情况下是显示一个Web页面。
一个使用WebView的常见的场景:是当你想要在你的应用程序中提供可能需要更新的信息,如一个终端用户协议或用户指南,那么使用WebView是很有帮助的。 在你的Android应用程序中你可以创建一个包含WebView的Activity然后用它来显示的在线托管的文档。
另一个使用WebView的常见的场景:是如果你的应用程序提供的数据总是需要从Internet上获取,如电子邮件。在这种情况下,你可能会发现它更容易在你的Android应用程序,显示所有的用户数据的网页,而不是执行一个网络请求,然后解析??数据,并渲染它在Android的布局,以建立一个WebView。相反,你可以设计的专为Android设备的网页,然后实施的WebView在你的Android应用程序加载的网页。
下面将向你展示如何开始使用WebView,以及如何做一些额外的事情,比如在你的Android应用程序中处理页面导航和从网页上绑定JavaScript到客户端的代码。
基本用法:
默认情况下,WebView不提供类似浏览器的窗口小部件,不启用JavaScript和网页错误被忽略。如果你的目的只是显示一些HTML作为用户界面的一部分,这也许还不错;用户将不再需要与网页进行交互阅读,并且该网页将不需要与用户进行交互。如果你需要一个全面的Web浏览器,那么你可能要调用浏览器应用程序来加载URL,而不是用WebView中显示它。例如:
1) 在你的APP中添加一个WebView:
2) 使用loadUrl()方法加载一个web页面:
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl(“http://www.example.com“);

3) 给应用程序添加访问网络的权限:
以上就是显示一个最基本的web页面所有的步骤。
在WebView中使用JavaScript :
如果你计划在你的WebView加载网页时使用JavaScript,你必须为你的WebView启用JavaScript。一旦启用JavaScript,你还可以创建你的应用程序代码和JavaScript代码之间的接口。
JavaScript在WebView中默认情况下是被禁用的。你可以通过附加在WebView上的WebSettings启用它。即使用getSettings()获取WebSettings ,然后启用使用setJavaScriptEnabled()方法启用JavaScript。
WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);

JavaScript代码绑定到Android代码:
在开发一个web应用程序,专门设计的WebView在你的Android应用程序中,您可以创建您的JavaScript代码和客户端Android代码之间的接口。例如,您的JavaScript代码可以在你的Android代码中调用一个方法来显示Dialog,而不是使用JavaScriptalert()方法。
调用addJavascriptInterface()方法绑定一个新的JavaScript和Android代码之间的接口。通过它 一个类实例绑定到你的JavaScrip,JavaScript可以调用一个接口名称访问类。

public class WebAppInterface {
    Context mContext;
    /** Instantiatethe interface and set the context */
    WebAppInterface(Context c) {
        mContext = c;
    }
    /** Show a toastfrom the web page */
    @JavascriptInterface
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }
}

注意:如果你设置的targetSdkVersion为17或更高,则必须添加@JavascriptInterface为任何您想要提供给您的JavaScript(该方法必须是public)方法添加标注。如果你不提供注解,在Android4.2或更高版本上运行时该方法是不能被网页访问的。
在上面这个例子中,WebAppInterface 类允许网页调用showToast()方法创建一个Toast 消息。
你可以通过addJavascriptInterface()方法和Android接口名,绑定这个类到运行在你的WebView中的JavaScript上。
WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new WebAppInterface(this), “Android”);

这将为运行在WebView中的JavaScript创建一个名为Android的接口。在这一点上,Web应用程序可以访问WebAppInterface类。例如,下面是一些HTML和JavaScript在单击按钮的时候将创建一个Toast消息。

Sayhello
<script type="text/javascript">
    function showAndroidToast(toast) {
        Android.showToast(toast);
    }
</script>

这不需要从JavaScript接口初始化Android。 WebView自动的将它应用到你的web页面中。 因此,按下按钮showAndroidToast()方法使用Android接口调用WebAppInterface.showToast()方法。
注:绑定到你的JavaScript对象运行在另一个线程,而不是在它构建的线程。
警告:使用addJavascriptInterface()将允许 JavaScript来控制你的Android应用程序。 这是一个非常有用的特性或危险的安全问题。 当WebView的HTML是不值得信任的(例如,部分或全部的HTML是由一个不知名的人或进程提供的),那么攻击将者执行包括在HTML和选择的任何客户端代码。因此,不应该使用addJavascriptInterface()除非你写的所有HTML和JavaScript出现在你WebView。 你应该也不允许用户导航到其他不是自己的网页,,在你的WebView内(相反,允许用户的通过默认浏览器应用程序打开外部链接。应用的web浏览器打开所有的URL链接,所以要小心你只有在处理页面导航中描述以下部分)。
处理页面导航:
当用户单击在WebView上的链接时,默认行为是启动一个处理URL的Android应用。通常默认网页浏览器打开和装在目的URL。但是你可以为WebView覆盖这个行为,以便在你的WebView上打开链接。然后,您可以允许用户前后浏览通过的由您的WebView保留的网页历史记录。
要打开用户点击链接,只是提供一个WebViewClient为您的WebView,使用setWebViewClient()。

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new WebViewClient());

这样。用户点击的所有的链接,都在你的WebView上加载。
如果你想更多的控制点击链接的加载,创建自己的WebViewClient的覆盖shouldOverrideUrlLoading()方法。

private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (Uri.parse(url).getHost().equals("www.example.com")) {
            // This is my web site, so do not override;let my WebView load the page
            return false;
        }
        // Otherwise, the link is not for a page on my site, so launch anotherActivity that handles URLs
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
        return true;
    }
}

然后为WebView创建一个新的WebViewClient实例:

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new MyWebViewClient());

现在,当用户点击一个链接时,系统调用shouldOverrideUrlLoading(),它会检查URL主机是否一个特定的域相匹配(定义如上)。如果不匹配,那么为了不重写的URL加载(它允许WebView加载的URL照常)方法返回false。如果URL中的主机不匹配,那么 一个Intent将被创建启动默认的Activity 处理URL(它可以解决用户的默认Web浏览器)。
浏览网页的历史记录:
当你的WebView重载URL加载的时,WebView会自动累加访问过的网页的历史记录。您可以通过goBack()和 goForward()方法向后、向前浏览。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // Check if thekey event was the Back button and if there's history
    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
        myWebView.goBack();
        return true;
    }
    // If it wasn'tthe Back key or there's no web page history, bubble up to the default
    // systembehavior (probably exit the activity)
    return super.onKeyDown(keyCode, event);
}

如果有一个实际的网页历史记录用户访问的canGoBack()方法返回true。同样地,你可以使用canGoForward()来检查是否有历史前进。如果不执行此检查,那么一旦用户到达历史的终结,GoBack()或goForward()什么也不做。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值