WebView,字面理解就是网页浏览,用于加载显示网页,类似浏览器,使用了WebKit渲染引擎加载显示网页,Android及iOS的webView的引擎都是webkit,对Html5提供支持.
下面整理一些webView的基础概念和使用方法:
- 添加权限(容易忽略的小失误):AndroidManifest.xml中必须使用许可”android.permission.INTERNET“,否则会出Web page not available错误。
webView基本设置:通过getsetting()方法进行设置
- void setAllowFileAccess(boolean allow):允许或禁止访问文件数据
- void setBlockNetworkImage(boolean flag):是否显示网络图像
- void setBuiltInZoonControls(boolean enabled):是否支持缩放
- void setCacheMode(int mode):设置缓存模式
- void setDefaultFontSize(int size):设置默认字体大小
- void setDefaultTextEncodingName(String encoding):设置默认编码
- void setDisplayZoomControls(boolean enabled):设置是否使用缩放按钮
- void setJavaScriptEnabled(boolean flag):设置是否支持JavaScript
- void setSupportZoom(boolean support):设置是否支持缩放
网页事件处理:通过WebViewClient和WebChromeClient处理
- WebViewClient用来帮助WebViewView处理各种通知,请求事件,常用方法如下:
- void doUpdateVisitedHistory(WebView view,String url,boolean isReload):更新历史记录
- void onFormResubmission(WebView view,Message dontResend,Message resend):重新请求网页数据
- void onPageFinished(WebView view,String url):网页加载完毕
- void onReceivedError(WebView view,int errorCode,String description,String failingUrl):报告错误信息
- void onScaleChanged(WebView view,float oldScale,float newScale):WebView发生变化
- boolean shouldOverrideKeyEvent(WebView view,KeyEvent event):控制新连接在当前WebView中打开
- WebChromeClient用于辅助WebView处理JavaScript的对话框,网站图标,网站标题,加载进度等。常用方法有:
- void onCloseWindow(WebView window):关闭WebView
- boolean onCreateWindow(WebView view,boolean dialog,boolean userGesture,Message resultMsg):创建WebView
- boolean onJsAlert(WebView view,String url,String message,JsResult result):处理JavaScript中的Alert对话框
- boolean onJsConfirm(WebView view,String url,String message,JsResult result):处理JavaScript中的Comfirm对话框
- boolean onJsPrompt(WebView view,String url,String message,String defaultValue,JsPromptResult result):处理JavaScript中的Prompt对话框
- void onProgressChanged(WebView view,int newProgress):加载进度条状态
- void onReceivedIcon(WebView view,Bitmap icon):网页图标改变
- void onReceivedTitle(WebView view,String title):网页标题改变
- WebViewClient用来帮助WebViewView处理各种通知,请求事件,常用方法如下:
1.WebView基本使用:
方法一:
在要Activity中实例化WebView组件:WebView webView = new WebView(this);
调用WebView的loadUrl()方法,设置WevView要显示的网页:
- 互联网用:webView.loadUrl(“http://www.baidu.com“);
- 本地文件用:webView.loadUrl(“file:///android_asset/xx.html”);
- 本地文件存放在:assets 文件中
调用Activity的setContentView( )方法来显示网页视图
- 用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面
下面是实例代码:
MainActivity.java 这是一个最简单的webView实例,只用到一个java文件,不需要使用布局view文件就能实现webView控件:
package com.example.webviewtest;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.app.Activity;
public class MainActivity extends Activity {
// 申明webView控件
private WebView mWebView = null;
// 创建一个url地址
private static final String url = "http://www.baidu.com";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化webView实例
mWebView = new WebView(this);
// 设置支持JavaScript
mWebView.getSettings().setJavaScriptEnabled(true);
// 加载url,即打开网页
mWebView.loadUrl(url);
// 设置当前Activity对应的视图为这个webView
setContentView(mWebView);
}
// 物理返回键的点击事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 如果点击的是“返回”并且webView支持返回功能
if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {
// 就执行返回
mWebView.goBack();
return true;
}
return false;
}
}
运行效果如图:
方法二:
在布局文件中声明WebView
调用WebView的loadUrl()方法,设置WevView要显示的网页:
- 互联网用:webView.loadUrl(“http://www.baidu.com“);
- 本地文件用:webView.loadUrl(“file:///android_asset/xx.html”);
- 本地文件存放在:assets 文件中
为了让WebView能够响应超链接功能(即点击链接打开新网页),调用setWebViewClient( )方法,设置 WebView视图
- 用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面
下面是实例代码:
activity_main.xml 中的就是一个webView控件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<WebView
android:id="@+id/wv_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
MainActivity.java 中是主要逻辑结构,相比上一个实例,增加了一个调用webViewClient类的方法,主要用于在webView中点击链接打开,返回功能也能使用
package com.example.webviewtest;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.app.Activity;
public class MainActivity extends Activity {
// 申明webView控件
private WebView mWebView = null;
// 创建一个url地址
private static final String url = "http://www.baidu.com";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化webView实例
mWebView = (WebView) findViewById(R.id.wv_main);
// 设置支持JavaScript
mWebView.getSettings().setJavaScriptEnabled(true);
// 加载url,即打开网页
mWebView.loadUrl(url);
mWebView.setWebViewClient(new WebViewClient() {
// WebViewClient的作用帮助webView去处理一些页面控制和请求通知
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
// 返回值
// true:控制网页在webView中打开
// false:调用系统浏览器或者第三方浏览器中打开
return true;
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return false;
}
}
运行效果:
以上,实现了最简单的webView功能,能够完成最基本的网页浏览
2.WebView中网页事件处理
- 使用WebViewClient对象:
// 设置WebViewClient事件,这里设置的是点击链接的加载为在当前WebView中加载
wv_main.setWebViewClient(new WebViewClient() {
// 控制新连接在当前WebView中打开
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
当点击了WebView中的一个链接,默认的行为是Android启动一个处理URL的应用,通常,默认的浏览器打开URL。但是可以在WebView中覆盖这一行为,使连接仍在WebView中打开。之后,根据在WebView中维护的网页浏览历史,用户可以向前或向后浏览网页。这里就需要用到WebViewClient对象,此实例就是上一个代码实例,这里就不再赘述
- 使用WebChromeClient对象:
// 设置WebChromeClient事件,这里设置的是跳转页面时在输入框中显示进度
wv_main.setWebChromeClient(new WebChromeClient() {
// 加载进度条改变
@Override
public void onProgressChanged(WebView view, int newProgress) {
et_inputUrl.setText("正在加载...");
if (newProgress == 100) {
et_inputUrl.setText("加载完成");
}
}
});
可以看到WebViewClient和WebChromeClient对象的使用方法大致相似,具体想要使用什么方法可根据官方文档查看,下面是实例的代码:
activity_main.xml 布局文件中增加了一个编辑框和按钮,用于跳转到输入的网址,然后下面就是一个WebView控件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<LinearLayout
android:id="@+id/LL_entry"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal" >
<EditText
android:id="@+id/et_input"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="10"
android:hint="enter the url" />
<Button
android:id="@+id/bt_gotoUrl"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="go-->" />
</LinearLayout>
<WebView
android:id="@+id/WV_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/LL_entry" />
</RelativeLayout>
MainActivity.java 这里使用了WebViewClient和WebChromeClient这两个对象,webViewClient对象用于让页面跳转就在当前WebView中;WebChromeClient对象用于显示页面跳转的进度:
package com.example.webchromeclienttest;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
private static final String defaultUrl = "http://www.baidu.com";
private EditText et_inputUrl = null;
private Button bt_gotoUrl = null;
private WebView wv_main = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化组件
initViews();
// 设置支持JavaScript
wv_main.getSettings().setJavaScriptEnabled(true);
// 设置支持缩放
wv_main.getSettings().setSupportZoom(true);
// 设置出现缩放工具
wv_main.getSettings().setBuiltInZoomControls(true);
// 加载默认url
wv_main.loadUrl(defaultUrl);
// 设置WebViewClient事件,这里设置的是点击链接的加载为在当前WebView中加载
wv_main.setWebViewClient(new WebViewClient() {
// 控制新连接在当前WebView中打开
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
// 设置WebChromeClient事件,这里设置的是跳转页面时在输入框中显示进度
wv_main.setWebChromeClient(new WebChromeClient() {
// 加载进度条改变
@Override
public void onProgressChanged(WebView view, int newProgress) {
et_inputUrl.setText("正在加载...");
if (newProgress == 100) {
et_inputUrl.setText("加载完成");
}
}
});
// 按钮的点击事件,也就是点击按钮就会转到输入的url的页面
bt_gotoUrl.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String newUrl = "http://" + et_inputUrl.getText().toString();
wv_main.loadUrl(newUrl);
}
});
}
// 初始化组件的方法
private void initViews() {
et_inputUrl = (EditText) findViewById(R.id.et_input);
bt_gotoUrl = (Button) findViewById(R.id.bt_gotoUrl);
wv_main = (WebView) findViewById(R.id.WV_main);
}
}
下面是运行效果:
以上,WebView的使用就总结到这里