资源
- Web Apps
- WebView
- Android4.4 webview实现分析
- Android WebView使用深入浅出
- 深入讲解WebView(上) - 互调,缓存,异常处理等
- 深入讲解WebView(下) - session,cookie等
- Android WebView Memory Leak WebView内存泄漏 ==! 这个我用leakcanary没检测出来
- PHP、Android、iOS 的恩恩怨怨
从Android 4.4(KitKat)开始,WebView组件是基于开源的Chromium项目.包含V8 js引擎并支持新的web标准,新webView也共享Chrome for Android的渲染引擎,另外,从5.0(Lollipop)开始,WebView被移到独立的apk中,因此它可以进行单独更新,可以从 “settings – Apps – Android System WebView” 中查看其版本;
用途
默认情况下,webView不启用js交互,并会忽略页面错误,适用于展示静态信息;
也可以启用js功能,实现与用户的交互
辅助类
- WebChromeClient 当可能影响webView UI的操作发生时会调用到该类,比如进度变化或者js提示框…
- WebViewClient 当可能影响内容渲染的操作发生时会调用到该类,比如错误等…另外,可以通过重写
shouldOverrideUrlLoading()
来中断url的加载; - WebSettings 功能设置,比如可否允许js代码;
基本操作
- 访问网络的话需要添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
- 启用js功能
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
设置返回键回退功能
mWv.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// 需要添加 mWv.canGoBack(),不然当返回到初始页面时,可能无法继续通过返回键关闭页面
if (keyCode == KeyEvent.KEYCODE_BACK && mWv.canGoBack()) {
mWv.goBack();
return true;
}
return false;
}
});
也可以通过设置所在Activity的onBackPressed()方法来支持webView回退:
@Override
public void onBackPressed() {
if (mWv.canGoBack()) {
mWv.goBack();
} else {
super.onBackPressed();
}
}
设置标题
mWv.setWebChromeClient(new WebChromeClient(){
@Override
public void onReceivedTitle(WebView view, String title) {
// title 是获取到的网页title,可以将之设置为webView所在页面的标题
MainActivity.this.setTitle(title);
}
)};
设置加载进度
@Override
protected void onCreate(Bundle savedInstanceState) {
//requestWindowFeature(Window.FEATURE_PROGRESS);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
......
mProgressDlg = new ProgressDialog(this);
mProgressDlg.setMessage("loading...");
mWv.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
//更新进度条示数
//这种方式我没看到效果...
//MainActivity.this.setProgress(newProgress);
//使用控件ProgressDialog来显示进度
//但记得这种方式需要在error发生时也进行取消
if (newProgress <= 90) {
mProgressDlg.setProgress(newProgress);
} else {
mProgressDlg.dismiss();
}
}
});
mWv