Android中WebView的详细解释:
1. 概念:
WebView(网络视图)能加载显示网页,可以将其视为一个浏览器。它使用了WebKit渲染引擎加载显示网页。
2. 使用方法:
(1).实例化WebView组件:
A.在Activity中实例化WebView组件。eg:
复制代码 代码如下:
WebView webView = new WebView(this);
B.调用WebView的loadUrl()方法,设置WevView要显示的网页.eg:
复制代码 代码如下:
互联网用:webView.loadUrl("http://www.google.com");
本地文件用:webView.loadUrl("file:///android_asset/XX.html");
本地文件存放在:assets 文件中
C.调用Activity的setContentView( )方法来显示网页视图。
D.需要在AndroidManifest.xml文件中添加权限,否则会出现Web page not available错误。
复制代码 代码如下:
<uses-permission android:name="android.permission.INTERNET" />
(2).自定义WebView组件继承WebViewClient:
A.在布局文件中声明WebView。eg:
复制代码 代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<WebView
android:id="@+id/webView1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
B.在Activity中实例化WebView。
C.调用WebView的loadUrl()方法,设置WebView要显示的网页.
D.调用setWebViewClient()方法设置WebView视图。响应链接功能。
E.需要在AndroidManifest.xml文件中添加权限,否则出现Web page not available错误。
复制代码 代码如下:
<uses-permission android:name="android.permission.INTERNET"/>
3. 两种方法的区别:
(1).第一种方法:点击链接是新开Android的系统browser中响应该链接。
(2).第二种方法:点击链接由自己处理,而不是新开Android的系统browser中响应该链接。给WebView添加一个事件监听对象(WebViewClient)并重写其中的shouldOverrideUrlLoading方法:对网页中超链接按钮的响应。当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url。
4. 总结:
(1). 用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面。
复制代码 代码如下:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
// goBack()表示返回WebView的上一页面
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
(2). 设置WebView基本信息:
A.如果访问的页面中有Javascript,则webview必须设置支持Javascript。
复制代码 代码如下:
webview.getSettings().setJavaScriptEnabled(true);
B.触摸焦点起作用:
复制代码 代码如下:
requestFocus();
C.取消滚动条:
复制代码 代码如下:
this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
5. 整体代码如下:
(1).MainActivity.java
package com.pansoft.webviewdemo;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Window;
import android.webkit.WebSettings;
import android.webkit.WebView;
import com.pansoft.webviewdemo.webView.MyWebView;
public class MainActivity extends Activity {
private WebView mWebView = null;
private WebSettings mSettings = null;
/** TAG */
private String TAG = getClass().getSimpleName();
/** URL */
private String FLG_URL = "http://www.baidu.com/";
private MyWebView myWebView;
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 第二种方法
init01();
// 第一种方法
// init02();
}
/**
* 加载的是webView本身的
*/
private void init01() {
setContentView(R.layout.activity_main);
mWebView =(WebView)findViewById(R.id.webView1);
mSettings = mWebView.getSettings();
// WebView设置支持JavaScript
mSettings.setJavaScriptEnabled(true);
// 加载URL
mWebView.loadUrl(FLG_URL);
myWebView = new MyWebView(this, mWebView);
mWebView.setWebViewClient(myWebView);
}
/**
* 加载的是系统自带的浏览器
*/
private void init02() {
mWebView = new WebView(this);
mSettings = mWebView.getSettings();
mSettings.setJavaScriptEnabled(true);
mWebView.loadUrl(FLG_URL);
setContentView(mWebView);
}
@Override
public void onBackPressed() {
super.onBackPressed();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
// goBack()表示返回WebView的上一页面
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
(2).MyWebView.java
package com.pansoft.webviewdemo.webView;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import android.webkit.HttpAuthHandler;
import android.webkit.WebView;
import android.webkit.WebViewClient;
/**
* MyWebView
*
* @author Administrator
*
*/
public class MyWebView extends WebViewClient {
private Context mContext;
private WebView mWebView;
private String TAG = getClass().getSimpleName();
/**
* 构造方法
*
* @param mContext
* @param mWebView
*/
public MyWebView(Context mContext, WebView mWebView) {
super();
this.mContext = mContext;
this.mWebView = mWebView;
}
/**
* 打开链接前的事件,为了避免再次按的时候加载的是系统自带的浏览器,点击链接由自己处理
*/
// 这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url != null) {
mWebView.loadUrl(url);
Log.d(TAG, "--->shouldOverrideUrlLoading--->");
}
return true;
}
/**
* 接收到Http请求的事件
*/
@Override
public void onReceivedHttpAuthRequest(WebView view,
HttpAuthHandler handler, String host, String realm) {
super.onReceivedHttpAuthRequest(view, handler, host, realm);
}
/**
* 载入页面开始的事件
*/
// 这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.d(TAG, "--->onPageStarted--->");
}
/**
* 载入页面完成的事件
*/
// 同样道理,我们知道一个页面载入完成,于是我们可以关闭loading条,切换程序动作。
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.d(TAG, "--->onPageFinished--->");
}
/**
* 当浏览器访问制定的网址发生错误时会通知我们应用程序,比如网络错误。
*/
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
}
}
(3).activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<WebView
android:id="@+id/webView1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
(4).权限:
<uses-permission android:name="android.permission.INTERNET" />