Android WebView設(shè)置微技巧
前言
Android開發(fā)中WebView肯定是我們經(jīng)常用到的類之一,但是Webview里面也有很多小細(xì)節(jié),很多坑需要注意。相信大家都遇到過這樣的場(chǎng)景:
- 掃描二維碼跳轉(zhuǎn)WebView時(shí)我們希望如果是一個(gè)下載鏈接直接啟動(dòng)系統(tǒng)瀏覽器下載
- Activity的title我們希望在網(wǎng)頁(yè)里面拿到title然后顯示
- 文本圖片等能夠自動(dòng)適配屏幕,不要圖片只顯示一半
- 點(diǎn)擊back不是回上一個(gè)activity而是去下一個(gè)網(wǎng)頁(yè)
- 點(diǎn)擊網(wǎng)頁(yè)里的鏈接不要啟動(dòng)系統(tǒng)瀏覽器
- 頂部顯示加載進(jìn)度條,類似微信
- Webview無(wú)法播放視頻
- WebView加載不出網(wǎng)頁(yè),微信卻可以
下面我就針對(duì)以上情況總結(jié)一下我在項(xiàng)目中對(duì)webview設(shè)置的一些技巧
具體設(shè)置
判斷下載鏈接直接啟動(dòng)系統(tǒng)瀏覽器下載
webview可以設(shè)置DownloadListener以監(jiān)聽是否是下載請(qǐng)求,這時(shí)可以做出判斷
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);
}
});
上面的設(shè)置就是讓webview監(jiān)聽,假如掃描二維碼進(jìn)來(lái)或者點(diǎn)擊鏈接為下載鏈接直接啟動(dòng)系統(tǒng)瀏覽器下載。
拿到title然后顯示
//設(shè)置WebChromeClient設(shè)置標(biāo)題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,拿到之后可以直接設(shè)置Activity的標(biāo)題
點(diǎn)擊back去下一個(gè)網(wǎng)頁(yè)
//啟用支持javascript
WebSettings settings = mWebview.getSettings();
settings.setJavaScriptEnabled(true);
//自適應(yīng)屏幕
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
tvTitleBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mWebview.canGoBack()){
mWebview.goBack();
}else
finish();
}
});
監(jiān)聽返回事件,假如mWebview有上一個(gè)網(wǎng)頁(yè),mWebview.goBack();去上一個(gè)網(wǎng)頁(yè),否則直接返回
點(diǎn)擊網(wǎng)頁(yè)里的鏈接不要啟動(dòng)系統(tǒng)瀏覽器
還有一個(gè)問題,假如你設(shè)置了mWebview.setWebChromeClient,很多手機(jī)估計(jì)直接就啟動(dòng)系統(tǒng)瀏覽器了,假如不想啟動(dòng)系統(tǒng)瀏覽器在下面加上這幾句代碼
mWebview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
加入進(jìn)度條
首先在XML文件中加進(jìn)度條
<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設(shè)置WebChromeClient的時(shí)候監(jiān)聽加載進(jìn)度,并顯示到進(jìn)度條
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);
}
}
});
最后在設(shè)置WebViewClient的時(shí)候可以判斷開始與結(jié)束,然后設(shè)置進(jìn)度條的隱藏與顯示,
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);
}
});
視頻播放
正常情況播放視頻是沒有問題的,但是有些有的視頻無(wú)法在這個(gè)webview下播放。這時(shí)候需要設(shè)置一下
在AndroidManifest.xml文件中對(duì)這個(gè)Activity加入:
android:hardwareAccelerated="true"
webview設(shè)置
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
還有一個(gè)小事情就是有時(shí)候由于對(duì)某些標(biāo)簽的不支持,導(dǎo)致webview加載不出來(lái)某些網(wǎng)頁(yè),比如這個(gè)網(wǎng)頁(yè)https://gold.xitu.io/post/584d52fdb123db00661c59fa這時(shí)候加上一句代碼就可以了
settings.setDomStorageEnabled(true);
這個(gè)小事情是參考這里:http://blog.csdn.net/zhoudailiang/article/details/50109621
最后
其他朋友肯定也遇到過關(guān)于webview的坑,歡迎留言提醒