Android WebView設置微技巧
前言
Android開發(fā)中WebView肯定是我們經常用到的類之一,但是Webview里面也有很多小細節(jié)湿右,很多坑需要注意权悟。相信大家都遇到過這樣的場景:
- 掃描二維碼跳轉WebView時我們希望如果是一個下載鏈接直接啟動系統(tǒng)瀏覽器下載
- Activity的title我們希望在網頁里面拿到title然后顯示
- 文本圖片等能夠自動適配屏幕碴卧,不要圖片只顯示一半
- 點擊back不是回上一個activity而是去下一個網頁
- 點擊網頁里的鏈接不要啟動系統(tǒng)瀏覽器
- 頂部顯示加載進度條,類似微信
- Webview無法播放視頻
- WebView加載不出網頁喻旷,微信卻可以
下面我就針對以上情況總結一下我在項目中對webview設置的一些技巧
具體設置
判斷下載鏈接直接啟動系統(tǒng)瀏覽器下載
webview可以設置DownloadListener以監(jiān)聽是否是下載請求,這時可以做出判斷
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監(jiān)聽牢屋,假如掃描二維碼進來或者點擊鏈接為下載鏈接直接啟動系統(tǒng)瀏覽器下載且预。
拿到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();
}
});
監(jiān)聽返回事件,假如mWebview有上一個網頁烙无,mWebview.goBack();去上一個網頁锋谐,否則直接返回
點擊網頁里的鏈接不要啟動系統(tǒng)瀏覽器
還有一個問題,假如你設置了mWebview.setWebChromeClient截酷,很多手機估計直接就啟動系統(tǒng)瀏覽器了涮拗,假如不想啟動系統(tǒng)瀏覽器在下面加上這幾句代碼
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的時候監(jiā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);
}
}
});
最后在設置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的坑,歡迎留言提醒