源码地址
与WebView相关的三个类,WebSettings, WebViewClient, WebChromeClient。类中的方法作用参见WebView详解(一)
三、WebView复杂的使用
1、进度条
在WebChromeClient里有onProgressChanged方法,利用此方法可以实现进度条。
(1)布局
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/mWebView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ProgressBar
android:id="@+id/mProgressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="3dp"
android:layout_gravity="center_vertical"
android:max="100"
android:progressDrawable="@drawable/progress_bar_web_view" />
</RelativeLayout>
(2)重写WebChromeClient中的onProgressChanged方法
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 100) {
// 网页加载完成
mProgressBar.setVisibility(View.GONE);
} else {
// 加载中
mProgressBar.setVisibility(View.VISIBLE);
mProgressBar.setProgress(newProgress);
}
}
});
2、在当前WebView中打开新连接,不跳转到系统浏览器
重写WebViewClient的shouldOverrideUrlLoading方法
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(你想在当前页面打开新连接){
view.loadUrl(url);
}else if(在一个新的activity中打开新连接){
Intent intent = new Intent(mContext, NewWebViewActivity.class);
intent.putputExtra("URL", url);
startActivity(intent);
}
return true;
}
});
在API 21中 shouldOverrideUrlLoading(WebView view, String url)被废弃,改为shouldOverrideUrlLoading(WebView view, WebResourceRequest request),我们可以通过request.getUrl()来获取url。
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return shouldOverrideUrlLoading(view, request.getUrl().toString());
}
3、back键返回访问历史
mWebView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
}
return false;
}
});
4、返回时剔除相同页面
同样是重写WebViewClient.shouldOverrideUrlLoading方法。其中url是要加载的新路径,originalUrl是原路径。
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (!url.equals(originalUrl)) {
loadUrl(url, view);
} else {
//页面相同,清楚此路径的历史记录。
view.clearHistory();
}
return true;
}
});
如果重写了WebViewClient的shouldOverrideUrlLoading方法,在当前页面加载新页面。ajax请求过后,重新
5、加载web url,插入本地js
在assets文件夹新建一个alert.js。只有一个方法,接受一个mseesage,并将message弹出。
function aliert(message) {
alert(message)
}
在onPageFinished方法回调的时候,将此js插入到WebView中。此处有坑,尝试了网上的各种方法,均不能成功,最后在stackoverflow上找到方法。
wvContent.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
injectScriptFile(view, "alert.js");
}
//ref http://stackoverflow.com/questions/21552912/android-web-view-inject-local-javascript-file-to-remote-webpage
private void injectScriptFile(WebView view, String scriptFile) {
InputStream input;
try {
input = getAssets().open(scriptFile);
byte[] buffer = new byte[input.available()];
input.read(buffer);
input.close();
String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP);
view.loadUrl("javascript:(function() {" +
"var parent = document.getElementsByTagName('head').item(0);" +
"var script = document.createElement('script');" +
"script.type = 'text/javascript';" +
// Tell the browser to BASE64-decode the string into your script !!!
"script.innerHTML = window.atob('" + encoded + "');" +
"parent.appendChild(script)" +
"})()");
} catch (IOException e) {
e.printStackTrace();
}
}
});
接下来就和用原生调用js一样了。
6、Cookie
和Cookie相关的两个类CookieSyncManager, CookieManager。CookieSyncManager在21的被废弃,因为Cookie可以自动同步了。
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
CookieSyncManager.createInstance(mContext);
}
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.removeSessionCookies(null);
cookieManager.removeAllCookies(null);
} else {
cookieManager.removeSessionCookie();
cookieManager.removeAllCookie();
}
cookieManager.setCookie("URL", "Cookie的value");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.flush();
} else {
CookieSyncManager.getInstance().sync();
}










网友评论