博客地址:http://blog.csdn.net/yang786654260
英文API:http://developer.android.com/reference/android/webkit/WebView.html
权限
WebView是一个展示网页的控件,因此需要联网的权限,在清单文件中添加权限:
<uses-permission android:name="android.permission.INTERNET" />
基本使用方法
默认情况下,WiewView不支持JavaScript 和忽视网页中的错误。如果你知识想在你的部分UI里展示一个页面,用户不与页面交互,页面也不用反响用户,这样很容易实现。如果你想展示一个成熟的页面,那么最好调用浏览器应用来展示页面:
Uri uri = Uri.parse("http://blog.csdn.net/yang786654260");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
在你的Activity中展示WebView可以在你的layout中包含< WebView >元素:
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
加载控件,打开页面
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://blog.csdn.net/yang786654260");
或者在onCreate()中把整个活动窗口设置为WebView:
WebView webview = new WebView(this);
setContentView(webview);
// Simplest usage: note that an exception will NOT be thrown
// if there is an error loading this page (see below).
webview.loadUrl("http://blog.csdn.net/yang786654260");
// OR, you can also load from an HTML string:
String summary = "<html><body>You scored <b>192</b> points.</body></html>";
webview.loadData(summary, "text/html", null);
// ... although note that there are restrictions on what this HTML can do.
// See the JavaDocs for loadData() and loadDataWithBaseURL() for more info.
在WebView中使用JavaScript
开启JavaScript的功能
如下使用到WebSettings:
WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
在Android代码中绑定JavaScript代码
有时候你需要在你的Android的WebView中设置些特殊功能,你可以创建一些借口来实现,例如你可以在Android代码中调用一个方法来展示Dialog来代替JavaScript的alert()。
你可以使用如下方法,来在JavaScript中调用类:
public void addJavascriptInterface (Object object, String name)
class JsObject {
@JavascriptInterface
public String toString() { return "injectedObject"; }
}
webView.addJavascriptInterface(new JsObject(), "injectedObject");
webView.loadData("", "text/html", null);
webView.loadUrl("javascript:alert(injectedObject.toString())");
下面有另一个例子:
public class WebAppInterface {
Context mContext;
/** Instantiate the interface and set the context */
WebAppInterface(Context c) {
mContext = c;
}
/** Show a toast from the web page */
@JavascriptInterface
public void showToast(String toast) {
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
}
警告:如果你设置targetSdkVersion为17或更高版本,你必须为任何一个对JavaScript有效的方法添加@JavascriptInterface注释,该方法必须是public,否则该方法不会对你的页面有效。
在这个例子中,WebAppInterface类允许web页面使用showToast()方法创建一个吐丝消息。然后你可以将这个类运行在WebView中,并把接口命名为“Android”:
WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new WebAppInterface(this), "Android");
然后你可以在JavaScript如下使用:
<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />
<script type="text/javascript">
function showAndroidToast(toast) {
Android.showToast(toast);
}
</script>
处理页面导航
当你点击WebView页面中的一个链接,默认情况下是Android启用一个处理URL的应用程序。你可以在你的WebView中覆盖这个行为:在你的WebView中打开这个链接,你可以允许使用者通过保存在WebView中的历史进行导航后退或前进。
使用WebViewCilent重载shouldOverrideUrlLoading()方法:
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (Uri.parse(url).getHost().equals("blog.csdn.net")) {
// 这是自己的网站,所以不覆盖;让WebView加载页面
return false;
}
// 否则,如果不是自己站点的链接, 启动另一个Activity来处理url
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
}
然后如下设置:
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new MyWebViewClient());
当你点击链接的时候,系统会调用 shouldOverrideUrlLoading()检查URL host是否匹配特定的域名。不匹配就会加载一个默认的应用来处理URL。
浏览网页的历史
当你的WebView重写URL加载,WebView会自动累积记录历史页面,你可以使用goBack()和goForward()向后和向前导航历史。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// Check if the key event was the Back button and if there's history
if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
myWebView.goBack();
return true;
}
// If it wasn't the Back key or there's no web page history, bubble up to the default
// system behavior (probably exit the activity)
return super.onKeyDown(keyCode, event);
}
注意:你必须要执行canGoBack()或canGoForward()检查。
HTML5 Video support
打开硬件加速,设置WbChromeClient,全屏支持,继承 onShowCustomView(View, WebChromeClient.CustomViewCallback),需要onHideCustomView(),getVideoLoadingProgressView()是可选的。
深入理解请看:
Migrating to WebView in Android 4.4 | Android Developers
http://developer.android.com/guide/webapps/migrating.html