我们在开发中有时候需要在App中加载一些服务器返回的网页链接来展示,但是又不能使用系统的浏览器或者第三方的浏览器来显示。那么我们需要使用到WebView这个控件,那么这个控件怎样去使用呢?
在使用WebView的时候,第一步一定要记得先去AndroidManifest.xml中配置权限
<uses-permission android:name=”android.permission.INTERNET”/>
如果只是简单的加载一个网页去进行展示的话,代码如下:
String openUrl="http://www.baidu.com";
WebView mWebView = (WebView)findViewById(R.id.webView);
mWebView.loadUrl(openUrl);
//当用户点击一个webView中的页面的链接时,通常,是由默认的的浏览器打开并加载目标URL的
//然而,你可以在webView中覆盖这一行为,那么链接就会在webView中打开
mWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//当返回值是true的时候由webView来打开,为false的时候则由第三方或者系统默认的浏览器打开
view.loadUrl(url);
return true;
}
});
如果你没有setWebViewClient();这个方法的话,你直接使用loadUrl()打开链接话,它就和你直接使用Intent()打开网页一样,会提示你是使用系统浏览器还是第三方浏览器打开。所以,你要是用你自己定义的WebView来打开这个网址的话,一定要记得设置setWebViewClient();为什么呢?因为,WebViewClient是帮助WebView去处理一些页面控制的请求和通知的。在Android中WebView主要负责解析渲染,而WebViewClient和WebChromeClient主要来辅助WebView的。
WebViewClient主要帮WebView处理各种通知和请求事件: onLoadResource, onPageStart, onPageFinished ,onReceiveError等。
WebChromeClient主要帮助WebView处理Javascript的对话框,网站图标,加载进度。比如:onCloseWindow,onJsAlert,onJsPromt等。
在我们实际使用中呢!如果你只是用来处理一些html的页面内容,只用WebViewClient就行了。但是,你要是用到JS,进度条这东西呢,你要使用WebChromeClient了。所以一般的话,我们就只需要使用一些简单的设置就行了。如下代码一般可以使用简单的页面显示了:
WebView webView= (WebView) findViewById(R.id.webview);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());//.希望点击链接继续在当前browser中响应,必须覆盖 WebViewClient对象。
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(url);
如果你还需要WebView支持JavaScript,IFrame或者一些框架语法的;则需设置:
//如果你想要在你的WebView中使用Javascript,你需要启动Javascript.则需要用到WebSttings来启动它。
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
因为,WebView是默认不支持这些的。设置支持后,还有一个东西你不能忘记,webView.requestFocus()。如果你不设置它的,在页面中是不会弹出软键盘的。
WebView 加载页面主要调用的三个方法:
1.LoadUrl :直接加载网页、图片(包括本地
图片、网络图片、gif图片等等)。
2.LoadData :显示文字与图片内容(模拟器1.5、1.6)。如果要加载图片请不要使用这个方法
3.LoadDataWithBaseURL:显示文字与图片内容。
在使用WebView的时候,可能你需要设置一些特殊的东西,那WebSettings中还提供以下方法:
setJavaScriptEnabled(true); //支持js
setPluginsEnabled(true); //支持插件
setUseWideViewPort(false); //将图片调整到适合webview的大小
setSupportZoom(true); //支持缩放
setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局
supportMultipleWindows(); //多窗口
setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //优先使用webview中缓存
setCacheMode(WebSettings.LOAD_NO_CACHE);//不适用缓存
setAllowFileAccess(true); //设置可以访问文件
setNeedInitialFocus(true); //当webview调用requestFocus时为webview设置节点
webview webSettings.setBuiltInZoomControls(true); //设置支持缩放
setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
setLoadWithOverviewMode(true); // 缩放至屏幕的大小
setLoadsImagesAutomatically(true); //支持自动加载图片
WebViewClient的几个主要方法:
doUpdateVisitedHistory(WebView view, String url, boolean isReload) //(更新历史记录)
onFormResubmission(WebView view, Message dontResend, Message resend) //(应用程序重新请求网页数据)
onLoadResource(WebView view, String url) // 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。
onPageStarted(WebView view, String url, Bitmap favicon) //这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。
onPageFinished(WebView view, String url) //在页面加载结束时调用。同样道理,我们知道一个页面载入完成,于是我们可以关闭loading 条,切换程序动作。
onReceivedError(WebView view, int errorCode, String description, String failingUrl)// (报告错误信息)
onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,String realm)//(获取返回信息授权请求)
onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) //重写此方法可以让webview处理https请求。
onScaleChanged(WebView view, float oldScale, float newScale) // (WebView发生改变时调用)
onUnhandledKeyEvent(WebView view, KeyEvent event) //(Key事件未被加载时调用)
shouldOverrideKeyEvent(WebView view, KeyEvent event)//重写此方法才能够处理在浏览器中的按键事件。
shouldOverrideUrlLoading(WebView view, String url)
//在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。
下面主要用代码显示一个简单的WebView
1.布局
<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/webView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</WebView>
</RelativeLayout>
2.主要实现方法
package com.example.richard.myapplication;
import android.app.Activity;
import android.app.ProgressDialog;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends Activity {
// private String openUrl="http://www.baidu.com";
private WebView mWebView;
private ProgressDialog mProgressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWebView();
}
private void initWebView(){
String openUrl="http://www.baidu.com";
mWebView = (WebView)findViewById(R.id.webView);
mWebView.loadUrl(openUrl);
//当用户点击一个webView中的页面的链接时,通常,是由默认的的浏览器打开并加载目标URL的
//然而,你可以在webView中覆盖这一行为,那么链接就会在webView中打开
mWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//当返回值是true的时候由webView来打开,为false的时候则由第三方或者系统默认的浏览器打开
view.loadUrl(url);
return true;
}
});
//WebViewClient帮助webView去处理一些页面控制和请求通知
//如果你想要在你的WebView中使用Javascript,你需要启动Javascript.则需要用到WebSttings来启动它。
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
//3.当你的webView覆盖了URL加载,它会自动生成历史访问记录。你可以通过goBack()或者goForward()向前或者
//向后反问已经反问过的网点。
//4.添加一个进度条
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
//newProgress是1-100的进度
if (newProgress == 100) {
//网页加载完成
endStopProgress();
} else {
//网页正在加载
startOpeanProgress(newProgress);
}
}
});
//5.为了加快网页的加载速度,有一个好的用户体验。我们需要使用到缓存,在WebView中,他默认是不使用缓存的。
//优先使用缓存 mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
//不使用缓存 mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
}
private void endStopProgress(){
if (mProgressDialog!=null && mProgressDialog.isShowing()){
mProgressDialog.dismiss();
mProgressDialog=null;
}
}
private void startOpeanProgress(int progress){
if(mProgressDialog == null) {
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setTitle("正在加载...");
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setProgress(progress);
mProgressDialog.show();
}else {
mProgressDialog.setProgress(progress);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()){
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
上面的代码只是简单的加载一个WebView。其中onKeyDown中方法是让其返回上一次加载的页面,如果没有上一次加载的页面则退出。WebView中还有一些很强大的功能,这里只是简单说明一下使用,如果发现什么不对的地方,请指出,交流交流…