WebView是安卓的一个浏览器控件,现在的HTML5风生水起,所有浏览器控件必然跟着受到重用;最近的项目就是因为需要嵌入Html5页面,所有WebView是一个必经之路,现在就总结一下基本用法;
WebView是安卓程序开发中一款基于WebKit浏览器引擎的解析网页的控件;
WebKit 是一个开源的浏览器引擎,与之相对应的引擎有Gecko(Mozilla Firefox 等使用)和Trident(也称MSHTML,IE 使用)。
WebKit 所包含的 WebCore排版引擎和 JSCore 引擎,均是从KDE的KHTML及KJS引擎衍生而来。它们都是自由软件,在GPL条约下授权,同时支持BSD系统的开发。所以Webkit也是自由软件,同时开放源代码。
WebKit的优势在于高效稳定,兼容性好,且源码结构清晰,易于维护。
WebKit 内核在手机上的应用也十分广泛,例如 Google 的手机Android、 Apple 的 iPhone, Nokia’s Series 60 browser 等所使用的 Browser 内核引擎,都是基于 WebKit。
看一下官方例子:
<WebView
android:id="@+id/webView1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Activity中调用
public class OfficialDemo extends Activity {
private WebView webview;
private Button button1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webview = (WebView) findViewById(R.id.webView1);
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
webview.loadUrl("http://www.baidu.com");
}
});
webview.getSettings().setJavaScriptEnabled(true);
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%
OfficialDemo.this.setProgress(progress * 1000);
}
});
webview.setWebViewClient(new WebViewClient() {
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
Toast.makeText(OfficialDemo.this, "Oh no! " + description,
Toast.LENGTH_SHORT).show();
}
});
}
}
重写onBackPressed(),然后调用WebView的canGoBack()以及goBack()函数进行返回;
if (webView1.canGoBack()) {
webView1.goBack();
}
希望只在当前WebView控件中浏览,则需要设置setWebViewClient();
重写WebViewClient的shouldOverrideUrlLoading(WebView view, String url) 方法;
public class MainActivity extends Activity {
private String tag = "MainActivity";
private WebView webView1;
private Button button1;
private Handler mHandler = new Handler();
@SuppressLint({ "JavascriptInterface", "SetJavaScriptEnabled" })
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView1 = (WebView) findViewById(R.id.webView1);
button1 = (Button) findViewById(R.id.button1);
WebSettings webSettings = webView1.getSettings();
// webSettings.setSavePassword(false);
webSettings.setSaveFormData(false);
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView1.setWebChromeClient(new MyWebChromeClient());
webView1.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
webView1.loadUrl("http://www.baidu.com");
}
});
// ##点击链接继续在当前browser中响应,而不是打开系统浏览器
webView1.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i(tag, "#点击跳转#使用当前browser进行浏览#shouldOverrideUrlLoading="
+ url);
view.loadUrl(url);
return true;
// return super.shouldOverrideUrlLoading(view, url);
}
});
}
final class DemoJavaScriptInterface {
DemoJavaScriptInterface() {
}
/**
* This is not called on the UI thread. Post a runnable to invoke
* loadUrl on the UI thread.
*/
public void clickOnAndroid() {
mHandler.post(new Runnable() {
public void run() {
Log.i(tag, "#clickOnAndroid#mHandler.post");
webView1.loadUrl("javascript:wave()");
}
});
}
}
final class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message,
JsResult result) {
Log.i(tag, "#onJsAlert#" + message);
result.confirm();
return true;
}
}
@Override
public void onBackPressed() {
if (webView1.canGoBack()) {
webView1.goBack();
} else {
super.onBackPressed();
}
}
}
如果希望有缓存,可以这样:
public class WebViewCacheActivity extends Activity {
private static final String TAG = WebViewCacheActivity.class
.getSimpleName();
private static final String APP_CACAHE_DIRNAME = "/webcache";
private TextView tv_topbar_title;
private RelativeLayout rl_loading;
private WebView mWebView;
private String url;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webview_layout);
url = "http://www.baidu.com";
findView();
}
private void findView() {
tv_topbar_title = (TextView) findViewById(R.id.tv_topbar_title);
rl_loading = (RelativeLayout) findViewById(R.id.rl_loading);
mWebView = (WebView) findViewById(R.id.mWebView);
initWebView();
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onLoadResource(WebView view, String url) {
Log.i(TAG, "onLoadResource url=" + url);
super.onLoadResource(view, url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView webview, String url) {
Log.i(TAG, "intercept url=" + url);
webview.loadUrl(url);
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.e(TAG, "onPageStarted");
rl_loading.setVisibility(View.VISIBLE); // 显示加载界面
}
@Override
public void onPageFinished(WebView view, String url) {
String title = view.getTitle();
Log.e(TAG, "onPageFinished WebView title=" + title);
tv_topbar_title.setText(title);
tv_topbar_title.setVisibility(View.VISIBLE);
rl_loading.setVisibility(View.GONE); // 隐藏加载界面
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
rl_loading.setVisibility(View.GONE); // 隐藏加载界面
Toast.makeText(getApplicationContext(), "", Toast.LENGTH_LONG)
.show();
}
});
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message,
JsResult result) {
Log.e(TAG, "onJsAlert " + message);
Toast.makeText(getApplicationContext(), message,
Toast.LENGTH_SHORT).show();
result.confirm();
return true;
}
@Override
public boolean onJsConfirm(WebView view, String url,
String message, JsResult result) {
Log.e(TAG, "onJsConfirm " + message);
return super.onJsConfirm(view, url, message, result);
}
@Override
public boolean onJsPrompt(WebView view, String url, String message,
String defaultValue, JsPromptResult result) {
Log.e(TAG, "onJsPrompt " + url);
return super.onJsPrompt(view, url, message, defaultValue,
result);
}
});
mWebView.loadUrl(url);
}
private void initWebView() {
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setRenderPriority(RenderPriority.HIGH);
// mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); // 设置
mWebView.getSettings()
.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
// 缓存模式
// 开启 DOM storage API 功能
mWebView.getSettings().setDomStorageEnabled(true);
// 开启 database storage API 功能
mWebView.getSettings().setDatabaseEnabled(true);
String cacheDirPath = getFilesDir().getAbsolutePath()
+ APP_CACAHE_DIRNAME;
// String cacheDirPath =
// getCacheDir().getAbsolutePath()+Constant.APP_DB_DIRNAME;
Log.i(TAG, "cacheDirPath=" + cacheDirPath);
// 设置数据库缓存路径
mWebView.getSettings().setDatabasePath(cacheDirPath);
// 设置 Application Caches 缓存目录
mWebView.getSettings().setAppCachePath(cacheDirPath);
// 开启 Application Caches 功能
mWebView.getSettings().setAppCacheEnabled(true);
}
/**
* 清除WebView缓存
*/
public void clearWebViewCache() {
// 清理Webview缓存数据库
try {
deleteDatabase("webview.db");
deleteDatabase("webviewCache.db");
} catch (Exception e) {
e.printStackTrace();
}
// WebView 缓存文件
File appCacheDir = new File(getFilesDir().getAbsolutePath()
+ APP_CACAHE_DIRNAME);
Log.e(TAG, "appCacheDir path=" + appCacheDir.getAbsolutePath());
File webviewCacheDir = new File(getCacheDir().getAbsolutePath()
+ "/webviewCache");
Log.e(TAG, "webviewCacheDir path=" + webviewCacheDir.getAbsolutePath());
// 删除webview 缓存目录
if (webviewCacheDir.exists()) {
deleteFile(webviewCacheDir);
}
// 删除webview 缓存 缓存目录
if (appCacheDir.exists()) {
deleteFile(appCacheDir);
}
}
/**
* 递归删除 文件/文件夹
*
* @param file
*/
public void deleteFile(File file) {
Log.i(TAG, "delete file path=" + file.getAbsolutePath());
if (file.exists()) {
if (file.isFile()) {
file.delete();
} else if (file.isDirectory()) {
File files[] = file.listFiles();
for (int i = 0; i < files.length; i++) {
deleteFile(files[i]);
}
}
file.delete();
} else {
Log.e(TAG, "delete file no exists " + file.getAbsolutePath());
}
}
}
最后,千万不要忘记权限;
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
本人已在Fragment中运行调用WebView控件,完全没有问题,随便用;
本文来自于CSDN博客
转载请联系作者并注明出处:http://blog.csdn.net/dreamintheworld/article/details/40043459