WebView 是一个视图小部件,在应用程序中,它可以嵌入到任何布局中来显示本地或远程的网页内容。WebView 基于开源的 WebKit 引擎。WebView 非常适合处理大图片。
应用程序使用 WebView 显示内容时,可以在点击页面中的链接时设置需要的监听和响应。
实现一个 WebViewClient 并把它关联到 WebView 上。在默认情况下,如果没有指定 WebViewClient ,那么 WebView 会将一个 URL 传递给 ActivityManager处理。其中:shouldOverrideUrlLoading() 默认返回 false。
效果如下:
拦截 WebView URL 的 Activity
MainActivity.java :
package com.crazy.webnet;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WebView webView = new WebView(this);
// 启用 JavaScript 支持
webView.getSettings().setJavaScriptEnabled(true);
// 添加一个客户端到视图上
// 让 WebView 自己处理所有的 URL 请求
webView.setWebViewClient(mClient);
// 如果仅仅只是加载页面,如下即可(不需要 WebViewClient 的对象):
// webView.setWebViewClient(new WebViewClient());
webView.loadUrl("http://www.baidu.com");
setContentView(webView);
}
private WebViewClient mClient = new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Uri request = Uri.parse(url);
if (TextUtils.equals(request.getAuthority(), "www.baidu.com")) {
// 允许加载( shouldOverrideUrlLoading()方法默认返回 false)
// 官网注释:This is my web site, so do not override; let my WebView load the page
return false;
}
// 如果注释掉下面 Intent 的相关内容,则可以拦截 WebView URL,不会加载页面
// Toast.makeText(MainActivity.this, "请换个网站", Toast.LENGTH_SHORT).show();
// 连接不是在本页面上,而是重新启动一个界面来显示
Intent intent =new Intent(Intent.ACTION_VIEW, request);
startActivity(intent);
return true;
}
};
}
</pre><p></p><p></p><p>补充:</p><p>对于加载本地的资源:</p><p></p><pre code_snippet_id="1905367" snippet_file_name="blog_20160928_3_9655744" name="code" class="java"> // 加载本地资源
webView.loadUrl("file:///android_asset/example.html");
对于其中的 setWebViewClient() 方法可以如下理解:
//覆盖WebView默认使用第三方或系统默认浏览器打开网页的行为,使网页用WebView打开
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
view.loadUrl(url);
return true;
}
});
判断网络加载过程 ( setWebChromeClient() 方法和 setWebClient() 方法的区别:):
/**
* 判断页面加载过程;
* 其中方法 setWebChromeClient():辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等;
* 而方法 setWebClient():主要处理解析,渲染网页等浏览器做的事情
*/
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
// 最大进度 100,所以当为 100 就是网页加载完成之时
if (newProgress == 100) {
// 网页加载完成
Toast.makeText(DistanceActivity.this, "OK!", Toast.LENGTH_SHORT).show();
} else {
// 加载中
Toast.makeText(DistanceActivity.this, "网页加载中!", Toast.LENGTH_SHORT).show();
}
}
});
可以在其中加上 ProgressBar 等显示进度的控件,模拟加载过程。
加载好网页后,对于返回键的点击,当想点击退回之前浏览的网页,而不是想点击后直接退出应用,则可以如下操作:
/**
* 改写物理按键——返回的逻辑
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
if(webView.canGoBack()) {
webView.goBack();//返回上一页面
return true;
}
else {
Toast.makeText(DistanceActivity.this, "正在退出应用!", Toast.LENGTH_SHORT).show();
// 如果没有设置 启用支持javascript 则需要按返回键很多次才能退出程序
System.exit(0);//退出程序
}
}
return super.onKeyDown(keyCode, event);
}
在 AndroidManifest.xml 中注册:
<uses-permission android:name="android.permission.INTERNET"/>