最新android webview,Android 关于WebView全方面的使用(项目应用篇)
1、關(guān)于WebView的使用:
與JS交互
撥打電話、發(fā)送短信、發(fā)送郵件
上傳圖片(版本兼容)
進(jìn)度條設(shè)置
字體大小設(shè)置
返回網(wǎng)頁(yè)上一層、顯示網(wǎng)頁(yè)標(biāo)題
全屏播放網(wǎng)絡(luò)視頻
首頁(yè)
2、文章說(shuō)明
WebView的使用已經(jīng)是老生常談了,看到很多文章說(shuō)了用法,但我很少看到全的或者是項(xiàng)目中可以直接使用的,都是看了很多后,自己把功能都集合在一起。這里是一份比較全面的WebView項(xiàng)目應(yīng)用篇,其中已經(jīng)解決了應(yīng)用時(shí)出現(xiàn)的很多bug,希望能對(duì)大家有幫助。
3、項(xiàng)目地址
4、內(nèi)容詳細(xì)介紹
4.1 電話短信郵件
電話短信郵件&與JS交互測(cè)試.png
給WebView設(shè)置WebViewClient:
webView.setWebViewClient(new MyWebViewClient(this));
其中MyWebViewClient內(nèi)容:
/**
* 監(jiān)聽(tīng)網(wǎng)頁(yè)鏈接:
* - 優(yōu)酷視頻直接跳到自帶瀏覽器
* - 根據(jù)標(biāo)識(shí):打電話、發(fā)短信、發(fā)郵件
* - 進(jìn)度條的顯示
* - 加載完成后,添加javascript監(jiān)聽(tīng)
*/
public class MyWebViewClient extends WebViewClient {
private IWebPageView iWebPageView;
private WebViewActivity activity;
public MyWebViewClient(IWebPageView iWebPageView) {
this.iWebPageView = iWebPageView;
activity = (WebViewActivity) iWebPageView;
}
@SuppressWarnings("deprecation")
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 優(yōu)酷視頻跳轉(zhuǎn)瀏覽器播放
if (url.startsWith("http://v.youku.com/")) {
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addCategory("android.intent.category.BROWSABLE");
Uri content_url = Uri.parse(url);
intent.setData(content_url);
activity.startActivity(intent);
return true;
// 電話、短信、郵箱
} else if (url.startsWith(WebView.SCHEME_TEL) || url.startsWith("sms:") || url.startsWith(WebView.SCHEME_MAILTO)) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
activity.startActivity(intent);
} catch (ActivityNotFoundException ignored) {
}
return true;
}
iWebPageView.startProgress();
view.loadUrl(url);
return false;
}
@Override
public void onPageFinished(WebView view, String url) {
if (activity.progress90) {
iWebPageView.hindProgressBar();
} else {
activity.pageFinish = true;
}
if (!CheckNetwork.isNetworkConnected(activity)) {
iWebPageView.hindProgressBar();
}
// html加載完成之后,添加監(jiān)聽(tīng)圖片的點(diǎn)擊js函數(shù)
iWebPageView.addImageClickListener();
super.onPageFinished(view, url);
}
// 視頻全屏播放按返回頁(yè)面被放大的問(wèn)題
@Override
public void onScaleChanged(WebView view, float oldScale, float newScale) {
super.onScaleChanged(view, oldScale, newScale);
if(newScale - oldScale > 7) {
view.setInitialScale((int)(oldScale / newScale * 100)); //異常放大,縮回去。
}
}
}
因?yàn)橛泻芏嗯渲?#xff0c;這里把各個(gè)功能模塊通過(guò)接口IWebPageView分離了出來(lái),這樣邏輯更清晰。
4.2 與JS交互
相信大家已經(jīng)看到了上面"----點(diǎn)擊了圖片"的Toast,這里需要先給WebView設(shè)置JavascriptInterface:
webView.addJavascriptInterface(new ImageClickInterface(this), "injectedObject");
其中ImageClickInterface相關(guān)代碼:
public class ImageClickInterface {
private Context context;
public ImageClickInterface(Context context) {
this.context = context;
}
@JavascriptInterface
public void imageClick(String imgUrl, String hasLink) {
Toast.makeText(context, "----點(diǎn)擊了圖片", Toast.LENGTH_SHORT).show();
// 查看大圖
// Intent intent = new Intent(context, ViewBigImageActivity.class);
// intent.putStringArrayListExtra("imgUrl",imgUrl);
// context.startActivity(intent);
// Log.e("----點(diǎn)擊了圖片 url: ", "" + imgUrl);
}
}
加入監(jiān)聽(tīng):
public void addImageClickListener() {
// 這段js函數(shù)的功能就是,遍歷所有的img節(jié)點(diǎn),
// 并添加onclick函數(shù),函數(shù)的功能是在圖片點(diǎn)擊的時(shí)候調(diào)用本地java接口并傳遞對(duì)應(yīng)src和has_link里的值過(guò)去
webView.loadUrl("javascript:(function(){" +
"var objs = document.getElementsByTagName(\"img\");" +
"for(var i=0;i
"{" +
"objs[i].οnclick=function(){window.injectedObject.imageClick(this.getAttribute(\"src\"),this.getAttribute(\"has_link\"));}" +
"}" +
"})()");
}
我們來(lái)看一下網(wǎng)頁(yè)對(duì)應(yīng)的源碼:
大家可能覺(jué)得有點(diǎn)怪異..因?yàn)檫@是保存的本地網(wǎng)頁(yè),如是線上的話,是這樣:
這里傳遞過(guò)去的是一個(gè)圖片url的值,沒(méi)有的屬性傳過(guò)去的則是null。這樣我們就可以對(duì)其進(jìn)行具體的操作了。
4.3 字體大小設(shè)置
/** 設(shè)置字體默認(rèn)縮放大小(改變網(wǎng)頁(yè)字體大小,setTextSize api14被棄用)*/
ws.setTextZoom(100);
其中100為默認(rèn)縮放比,通過(guò)設(shè)置縮放比來(lái)控制字體大小。
4.4 上傳圖片(版本兼容) & 全屏播放網(wǎng)絡(luò)視頻 & 顯示網(wǎng)頁(yè)標(biāo)題
這里因?yàn)槠?#xff0c;里面的代碼很多,就不貼出來(lái)了,大家可以點(diǎn)擊MyWebChromeClient.java,查看具體代碼。
上傳圖片.png
4.5 返回網(wǎng)頁(yè)上一層
返回網(wǎng)頁(yè)上一層及退出全屏等操作:
@Overridepublic
boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
//全屏播放退出全屏
if (webChromeClient.inCustomView()) {
hideCustomView();
return true;
//返回網(wǎng)頁(yè)上一頁(yè)
} else if (webView.canGoBack()) {
webView.goBack();
return true;
//退出網(wǎng)頁(yè)
} else {
webView.loadUrl("about:blank");
finish();
}
}
return false;
}
4.6 進(jìn)度條設(shè)置
這里用的是先加載到90%再加載到100%, 具體為什么相信大家都懂吧...
// 進(jìn)度條 假裝加載到90%
public void startProgress90() {
for (int i = 0; i < 900; i++) {
final int progress = i + 1;
mProgressBar.postDelayed(new Runnable() {
@Override
public void run() {
mProgressBar.setProgress(progress);
if (progress == 900) {
progress90 = true;
if (pageFinish) {
startProgress90to100();
}
}
}
}, (i + 1) * 2);
}
}
再加載到100%:
// 加載到90%后再加載到100%
public void progressChanged(int newProgress) {
if (progress90) {
int progress = newProgress * 100;
if (progress > 900) {
mProgressBar.setProgress(progress);
if (progress == 1000) {
mProgressBar.setVisibility(View.GONE);
}
}
}
}
5、推薦閱讀
如很多細(xì)節(jié)不知緣由的查看這里
6、所遇問(wèn)題
找不到assets目錄下資源:注意assets在哪層文件夾下!與AndroidManifest.xml同級(jí)
視頻播放寬度比webview設(shè)置的寬度大,超過(guò)屏幕:設(shè)置ws.setLoadWithOverviewMode(false);
onDestroy時(shí)的清除資源操作
End
最后再附一遍項(xiàng)目地址😆:
總結(jié)
以上是生活随笔為你收集整理的最新android webview,Android 关于WebView全方面的使用(项目应用篇)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 有大神知道鼻子两侧发红是怎么回事么?求助
- 下一篇: android handler作用,An