Android WebView设置微技巧
前言
Android开发中WebView肯定是我们经常用到的类之一,但是Webview里面也有很多小细节,很多坑需要注意。相信大家都遇到过这样的场景:
- 扫描二维码跳转WebView时我们希望如果是一个下载链接直接启动系统浏览器下载
- Activity的title我们希望在网页里面拿到title然后显示
- 文本图片等能够自动适配屏幕,不要图片只显示一半
- 点击back不是回上一个activity而是去下一个网页
- 点击网页里的链接不要启动系统浏览器
- 顶部显示加载进度条,类似微信
- Webview无法播放视频
- WebView加载不出网页,微信却可以
下面我就针对以上情况总结一下我在项目中对webview设置的一些技巧
具体设置
判断下载链接直接启动系统浏览器下载
webview可以设置DownloadListener以监听是否是下载请求,这时可以做出判断
mWebview.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse(url);
intent.setData(content_url);
startActivity(intent);
}
});
上面的设置就是让webview监听,假如扫描二维码进来或者点击链接为下载链接直接启动系统浏览器下载。
拿到title然后显示
//设置WebChromeClient设置标题title
mWebview.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
Logger.d("title:" + title);
if (TextUtils.isEmpty(mTitle)) {
tv_title.setText(title);
} else {
tv_title.setText(mTitle);
}
}
});
这段代码就是使用WebChromeClient获取title,拿到之后可以直接设置Activity的标题
点击back去下一个网页
//启用支持javascript
WebSettings settings = mWebview.getSettings();
settings.setJavaScriptEnabled(true);
//自适应屏幕
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
tvTitleBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mWebview.canGoBack()){
mWebview.goBack();
}else
finish();
}
});
监听返回事件,假如mWebview有上一个网页,mWebview.goBack();去上一个网页,否则直接返回
点击网页里的链接不要启动系统浏览器
还有一个问题,假如你设置了mWebview.setWebChromeClient,很多手机估计直接就启动系统浏览器了,假如不想启动系统浏览器在下面加上这几句代码
mWebview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
加入进度条
首先在XML文件中加进度条
<ProgressBar
android:id="@+id/webview_progressbar"
android:layout_width="match_parent"
android:layout_height="3dp"
style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal"
android:background="@color/white"
android:progressBackgroundTint="@color/white"
android:indeterminateTint="@color/webview_progressbar_color"
android:indeterminateTintMode="src_atop"/>
然后在webview设置WebChromeClient的时候监听加载进度,并显示到进度条
mWebview.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
progressBar.setProgress(newProgress);
}
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
KLog.d("title:" + title);
if (TextUtils.isEmpty(mTitle)) {
tvTitle.setText(title);
} else {
tvTitle.setText(mTitle);
}
}
});
最后在设置WebViewClient的时候可以判断开始与结束,然后设置进度条的隐藏与显示,
mWebview.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
progressBar.setVisibility(View.VISIBLE);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
progressBar.setVisibility(View.GONE);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
progressBar.setVisibility(View.GONE);
}
});
视频播放
正常情况播放视频是没有问题的,但是有些有的视频无法在这个webview下播放。这时候需要设置一下
在AndroidManifest.xml文件中对这个Activity加入:
android:hardwareAccelerated="true"
webview设置
if (Build.VERSION.SDK_INT < 8) {
webview.getSettings().setPluginsEnabled(true);
} else {
webview.getSettings().setPluginState(PluginState.ON);
}
if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.LOLLIPOP) {
webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
One more thing
还有一个小事情就是有时候由于对某些标签的不支持,导致webview加载不出来某些网页,比如这个网页https://gold.xitu.io/post/584d52fdb123db00661c59fa这时候加上一句代码就可以了
settings.setDomStorageEnabled(true);
这个小事情是参考这里:http://blog.csdn.net/zhoudailiang/article/details/50109621
最后
其他朋友肯定也遇到过关于webview的坑,欢迎留言提醒