在开发过程中,发现webView在使用时需要设置较多的参数,进行总结如下.
webView的官方API是:http://www.android-doc.com/reference/android/webkit/WebView.html
webView的继承关系如下:
webView采用WebKit渲染引擎来显示网页,能够先前和向后导航,能够放大和缩小,能够进行文本搜索等。WebKit是一个开源的浏览器引擎。Safari、Chrome都是基于WebKit的。
为了让程序能够连接网络,在webView中loadURL,需要再AndroidManifest.xml中添加INTERNET权限。
<uses-permission android:name="android.permission.INTERNET" />
在默认情况下,webView没有提供类似于浏览器的窗口小部件,不支持JavaScript,而且忽略网页错误。如果你的目标只是显示一些HTML作为UI的一部分,用于不需要与web进行交互,那么webView可行。如果你需要一个完全成熟的web浏览器,那么就需要用调用一个应用程序,而不是用webView进行显示。
Uri uri = Uri.parse("http://www.example.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
1. webView加载网页的方法:
// 加载网页,但是不会抛出异常
webview.loadUrl("http://slashdot.org/");
// 加载HTML字符串
String summary = "<html><body>You scored <b>192</b> points.</body></html>";
webview.loadData(summary, "text/html", null);
// 加载本地文件,格式固定的,文件位置
webView.loadUrl(file:///android_assets/XXX.html);
2. 使用webView时,有几个地方需要set自己的方法:
1)创建和设置WebChromeClient类。当会影响到用户所看得到的UI界面时将会被调用,例如进度更新或者JS的告警等。
2)创建和设置WebViewClient类,当影响了内容的呈现、渲染时会被调用,例如错误等。还可以截取URL转载在这里(通过shouldOverrideUrlLoading()方法)。
3)修改WebSettings,例如通过setJavaScriptEnable()启动JavaScript。在设置为true后,webView能够加载JS
4)通过addJavascriptInterface(Object, String)方法为webView绑定一个Java对象,这个方法为JavaScript绑定了一个Java对象,可以通过这个对象访问JS。
下面这个例子呈现了如何进行错误处理、设置和进度更新。
// Let's display the progress in the activity title bar, like the
// browser app does.
getWindow().requestFeature(Window.FEATURE_PROGRESS);
webview.getSettings().setJavaScriptEnabled(true);
final Activity activity = this;
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%
activity.setProgress(progress * 1000);
}
});
webview.setWebViewClient(new WebViewClient() {
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
}
});
webview.loadUrl("http://developer.android.com/");
3. WebChromeClient
WebChromeClient直接继承自Object类,主机通知当前界面改变的回调接口。主要辅助webView处理JavaScript的对话框、网站图标、网站title、加载进度条等。
例如:
onCloseWindow() 关闭webView
onCreatWindow()
onJsAlert() webView上alert无效,需要定制WebChromeClient处理
onJsPrompt()
onJsConfirm()
onProgressChanged()
onReceivedIcon()
onReceivedTitle()
4. WebViewClient
webViewClient用于辅助webVIew处理各种停止、请求事件,主要包括:
onLoadResource()
onPageStart()
onPageFinish()
onReceiveError()
onReceivedHttpAuthRequest()
5. 与JS交互
Activity的代码:
public class MainActivity extends Activity {
private WebView webView;
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
webView = (WebView) findViewById(R.id.wv);
// 不使用缓存
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
// 支持JavaScript
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());
// JS回调Android
webView.addJavascriptInterface(new JSCallBack(), "JSCallBack");
webView.loadUrl("http://haojiazhang123.com/share/shop/education_market.html");
}
// JS回调Android
public class JSCallBack {
@JavascriptInterface
public void jsCallBack(String orderInfo) {
// orderInfo是JS传入的参数
Toast.makeText(context, "JS调用Android", Toast.LENGTH_SHORT).show();
}
}
// Android回调JS
private void callJSPayResult(String payResult) {
webView.loadUrl("javascript:alipayCallBack('" + payResult + "')");
}
}
xml
<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">
<WebView
android:id="@+id/wv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
AndroidManifest.xml要加上访问网络的权限
<uses-permission android:name="android.permission.INTERNET" />
6. webView的其他常用设置
private void init() {
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
// 自适应屏幕
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
// 不支持缩放(如果要支持缩放,html页面本身也要支持缩放:不能加user-scalable=no)
settings.setBuiltInZoomControls(false);
settings.setSupportZoom(false);
settings.setDisplayZoomControls(false);
// 隐藏scrollbar
setVerticalScrollBarEnabled(false);
setHorizontalScrollBarEnabled(false);
// 支持通过js打开新的窗口
settings.setJavaScriptCanOpenWindowsAutomatically(true);
}
/**
* 禁用网页上的点击事件
*/
public void setNoClick() {
setClickable(false);
setLongClickable(false);
setFocusable(false);
setFocusableInTouchMode(false);
setVerticalScrollBarEnabled(false);
setHorizontalScrollBarEnabled(false);
}