萬(wàn)能的webView之Activity

對(duì)于使用webview加載一個(gè)網(wǎng)頁(yè),使用它的loadurl()方法即可,如果在程序內(nèi)要打開(kāi)網(wǎng)頁(yè),難么就要自己創(chuàng)建一個(gè)WebViewClient,通過(guò)setWebViewClient進(jìn)行關(guān)聯(lián),再如果網(wǎng)頁(yè)里面有javaScript那就要設(shè)置了

//啟用支持javascriptWebSettings settings =webView.getSettings();

settings.setJavaScriptEnabled(true);

這都是一系列問(wèn)題,但有沒(méi)有想過(guò)直接寫(xiě)一個(gè)activity,只需傳入url就可以顯示網(wǎng)頁(yè),包括解決緩存的使用:

webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

后退時(shí)的操作:

//改寫(xiě)物理按鍵——返回的邏輯@OverridepublicbooleanonKeyDown(intkeyCode, KeyEvent event) {//TODO Auto-generated method stubif(keyCode==KeyEvent.KEYCODE_BACK)

{

if(webView.canGoBack())

{

webView.goBack();//返回上一頁(yè)面returntrue;

}else{

System.exit(0);//退出程序}

}returnsuper.onKeyDown(keyCode, event);

}

等等一些列問(wèn)題.

在此就引入了一個(gè)相對(duì)比較萬(wàn)能的webview,傳入url即可,復(fù)制就能使用的webview的activity

importandroid.content.Intent;

importandroid.util.Log;

importandroid.view.View;

importandroid.webkit.WebView;

importandroid.widget.TextView;

publicclassWhyWebActivityextendsCanbackWebActivityimplementsView.OnClickListener?{

privateTextView?header_title;

privateString?webPageTitle;

@Override

protectedintgetContentView()?{

returnR.layout.activity_new_web;

}

@Override

protectedWebView?getWebview()?{

return(WebView)?findViewById(R.id.new_web_view);

}

@Override

protectedNumberProgressBar?getProgressbar()?{

return(NumberProgressBar)?findViewById(R.id.new_web_progress_bar);

}

@Override

protectedTextView?getTextViewClose()?{

return(TextView)?findViewById(R.id.header_left_close);

}

@Override

protectedvoidsetTitle(String?urlTitle)?{

Intent?intent?=?getIntent();

if(intent?!=null)?{

webPageTitle?=?intent.getStringExtra("title");

}

if(webPageTitle?!=null&&?!webPageTitle.equals(""))?{

header_title.setText(webPageTitle);

}else{

header_title.setText(urlTitle);

}

}

@Override

protectedvoidonLoadError(WebView?webView,interrorCode,?String?description,?String?failingUrl)?{

}

@Override

protectedvoidonLoadEnd(String?url)?{

}

@Override

protectedvoidinitEnd()?{

webview.loadUrl(getIntent().getStringExtra("url"));//?網(wǎng)址

findViewById(R.id.header_left_btn).setOnClickListener(this);//?返回按鈕點(diǎn)擊事件

header_title?=?(TextView)?findViewById(R.id.header_title);

}

@Override

protectedvoidjsCallJava(MWebviewClient?mWebviewClient)?{

}

@Override

protectedvoidonJsRequest(Object?data)?{

}

@Override

publicvoidonClick(View?v)?{

switch(v.getId())?{

//?點(diǎn)擊關(guān)閉頁(yè)面

caseR.id.header_left_btn:

onBackPressed();

break;

}

}

}

然后就是父類CanBackWebActivity


packagecn.moviebuff.app.homewall.Web;

importandroid.annotation.SuppressLint;

importandroid.app.Activity;

importandroid.content.Intent;

importandroid.graphics.Bitmap;

importandroid.graphics.Color;

importandroid.net.http.SslError;

importandroid.os.Bundle;

importandroid.util.Log;

importandroid.view.Gravity;

importandroid.view.KeyEvent;

importandroid.view.View;

importandroid.webkit.JavascriptInterface;

importandroid.webkit.SslErrorHandler;

importandroid.webkit.WebChromeClient;

importandroid.webkit.WebSettings;

importandroid.webkit.WebView;

importandroid.widget.TextView;

importandroid.widget.Toast;

importcom.umeng.socialize.ShareAction;

importcom.umeng.socialize.UMShareListener;

importcom.umeng.socialize.bean.SHARE_MEDIA;

importcom.umeng.socialize.media.UMImage;

importorg.json.JSONException;

importorg.json.JSONObject;

importbutterknife.ButterKnife;

publicabstractclassCanbackWebActivityextendsActivity?{

protectedWebView?webview;

protectedNumberProgressBar?progressbar;

protectedTextView?textViewClose;

protectedMWebviewClient?mWebviewClient;

privateString?webTitle;

@Override

publicvoidonCreate(Bundle?savedInstanceState)?{

super.onCreate(savedInstanceState);

initView();

if(null!=?webview?&&null!=?progressbar?&&null!=?textViewClose)?{

iniWebview();

initEnd();

}

}

@Override

publicIntent?getIntent()?{

returnsuper.getIntent();

}

privatevoidinitView()?{

setContentView(getContentView());

ButterKnife.inject(this);

webview?=?getWebview();

progressbar?=?getProgressbar();

textViewClose?=?getTextViewClose();

toastRoot?=?getLayoutInflater().inflate(R.layout.activity_sign,null);

}

protectedabstractintgetContentView();

protectedabstractWebView?getWebview();

protectedabstractNumberProgressBar?getProgressbar();

protectedabstractTextView?getTextViewClose();

protectedabstractvoidsetTitle(String?urlTitle);

protectedabstractvoidonLoadError(WebView?webView,interrorCode,?String?description,?String?failingUrl);

protectedabstractvoidonLoadEnd(String?url);

protectedabstractvoidinitEnd();

protectedabstractvoidjsCallJava(MWebviewClient?mWebviewClient);

protectedabstractvoidonJsRequest(Object?data);

privatestaticfinalString?APP_CACAHE_DIRNAME?="/webcache";

@SuppressLint("SetJavaScriptEnabled")

@SuppressWarnings("deprecation")

privatevoidiniWebview()?{

webview.getSettings().setSupportZoom(false);

webview.getSettings().setBuiltInZoomControls(false);

try{

webview.getSettings().setJavaScriptEnabled(true);

}catch(Exception?e)?{

System.out.println(e);

}

webview.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);

webview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);//設(shè)置?緩存模式

//?開(kāi)啟?DOM?storage?API?功能

webview.getSettings().setDomStorageEnabled(true);

//開(kāi)啟?database?storage?API?功能

webview.getSettings().setDatabaseEnabled(true);

String?cacheDirPath?=?getFilesDir().getAbsolutePath()?+?APP_CACAHE_DIRNAME;

//設(shè)置??Application?Caches?緩存目錄

webview.getSettings().setAppCachePath(cacheDirPath);

//開(kāi)啟?Application?Caches?功能

webview.getSettings().setAppCacheEnabled(true);

webview.setWebChromeClient(newMChormeClient());

mWebviewClient?=newMWebviewClient(webview);

webview.setWebViewClient(mWebviewClient);

progressbar.setProgressTextColor(Color.parseColor("#29b6f6"));

textViewClose.setOnClickListener(newView.OnClickListener()?{

@Override

publicvoidonClick(View?v)?{

finish();

}

});

//?添加js交互接口類,并起別名?webtest

webview.addJavascriptInterface(this,"webtest");

webview.setWebViewClient(newMWebviewClient(webview));

}

protectedclassMWebviewClientextendsWVJBWebViewClient?{

publicMWebviewClient(WebView?webView)?{

//交互

super(webView,newWVJBHandler()?{

@Override

publicvoidrequest(Object?data,?WVJBResponseCallback?callback)?{

JSONObject?outdata?=?(JSONObject)?data;

onJsRequest(outdata);

Intent?intent?=newIntent();

try{

String?act?=?outdata.getString("act");

if(act?!=null)?{

if(act.equals("showToast"))?{

if(outdata.has("str"))?{

String?str?=?outdata.get("str").toString();

if(str?!=null)?{

showToast(str);

//????????????????????????????????????????T.showShort(CanbackWebActivity.this,str);

}

}

}elseif

}

}

}catch(JSONException?e)?{

//?TODO?Auto-generated?catch?block

e.printStackTrace();

}

}

});

jsCallJava(this);

}

//加載開(kāi)始

@Override

publicvoidonPageStarted(WebView?view,?String?url,?Bitmap?favicon)?{

super.onPageStarted(view,?url,?favicon);

}

//加載完成

@Override

publicvoidonPageFinished(WebView?view,?String?url)?{

progressbar.setVisibility(View.GONE);

onLoadEnd(url);

super.onPageFinished(view,?url);

booleanisBack?=?webview.canGoBack();

if(isBack)?{

textViewClose.setVisibility(View.VISIBLE);

}else{

textViewClose.setVisibility(View.GONE);

}

//被點(diǎn)擊的圖片地址為:http://image.moviebuff.cn/images/201609/mem_2016-09-19-10_1474253053_99140.jpg!600-max

//動(dòng)態(tài)注入js

//?這段js函數(shù)的功能就是,遍歷所有的img幾點(diǎn),并添加onclick函數(shù),函數(shù)的功能是在圖片點(diǎn)擊的時(shí)候調(diào)用本地java接口并傳遞url過(guò)去

view.loadUrl("javascript:(function(){"+

"var?objs?=?document.getElementsByTagName(\"img\");?"+

"for(var?i=0;i

"{"

+"????objs[i].onclick=function()??"+

"????{??"

+"????????webtest.jsInvokeJava(this.src);??"+

"????}??"+

"}"+

"})()");

}

//加載失敗

@Override

publicvoidonReceivedError(WebView?view,interrorCode,?String?description,?String?failingUrl)?{

progressbar.setVisibility(View.GONE);

onLoadError(webView,?errorCode,?description,?failingUrl);

}

@Override

publicvoidonReceivedSslError(WebView?view,?SslErrorHandler?handler,?SslError?error)?{

super.onReceivedSslError(view,?handler,?error);

progressbar.setVisibility(View.GONE);

}

}

@JavascriptInterface

publicvoidjsInvokeJava(String?img)?{

Log.i("ddddddddddsss","被點(diǎn)擊的圖片地址為:"+?img);

}

protectedclassMChormeClientextendsWebChromeClient?{

@Override

publicvoidonProgressChanged(WebView?view,intnewProgress)?{

if(newProgress?==100)?{

progressbar.setVisibility(View.GONE);

}else{

if(progressbar.getVisibility()?!=?View.VISIBLE)?{

progressbar.setVisibility(View.VISIBLE);

}

progressbar.setProgress(newProgress);

}

super.onProgressChanged(view,?newProgress);

}

@Override

publicvoidonReceivedTitle(WebView?view,?String?title)?{

super.onReceivedTitle(view,?title);

webTitle?=?title;

setTitle(title);

}

}

@Override

publicvoidonBackPressed()?{

if(null!=?webview?&&?webview.canGoBack())?{

webview.goBack();

}else{

webview.loadUrl("about:blank");

super.onBackPressed();

}

}

@Override

publicbooleanonKeyDown(intkeyCode,?KeyEvent?event)?{

if(keyCode?==?KeyEvent.KEYCODE_BACK?&&?event.getRepeatCount()?==0)?{

webview.loadUrl("about:blank");

//webView.destroy();

onBackPressed();

returntrue;

}

returnsuper.onKeyDown(keyCode,?event);

}

privatevoidsetShareContent(String?share_text,?String?share_image,?String?share_url,?String?title)?{

finalSHARE_MEDIA[]?displaylist?=newSHARE_MEDIA[]{

SHARE_MEDIA.WEIXIN,?SHARE_MEDIA.WEIXIN_CIRCLE,

SHARE_MEDIA.QQ,?SHARE_MEDIA.QZONE

};

UMImage?localImage?=newUMImage(thisActivity,?R.drawable.ic_launcher);

newShareAction(this).setDisplayList(displaylist)

.withText(share_text)//?摘要

.withTitle(title)//?標(biāo)題

.withTargetUrl(share_url)//?分享的網(wǎng)址

.withMedia(localImage)//?分享的圖片

.setListenerList(newUMShareListener()?{

@Override

publicvoidonResult(SHARE_MEDIA?platform)?{

T.showShort(thisActivity,"分享成功啦");

}

@Override

publicvoidonError(SHARE_MEDIA?platform,?Throwable?t)?{

T.showShort(thisActivity,"分享失敗啦");

}

@Override

publicvoidonCancel(SHARE_MEDIA?platform)?{

T.showShort(thisActivity,"分享取消了");

}

})

.open();

}

privateView?toastRoot;

privateToast?toast?=null;

privatevoidshowToast(String?msg)?{

TextView?tv?=?(TextView)?toastRoot.findViewById(R.id.TextViewInfo);

if(toast?==null)?{

toast?=newToast(CanbackWebActivity.this);

tv.setText(msg);

}else{

tv.setText(msg);

}

toast.setView(toastRoot);

toast.setGravity(Gravity.CENTER,0,0);

toast.show();

}

}

剩下就是布局文件里的webview了,這個(gè)就不提供了,以上僅供參考,因?yàn)樗陧?xiàng)目的不同,部分可能需要自行改改。

csdn項(xiàng)目地址:http://blog.csdn.net/greatdaocaoren/article/details/54879723

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 7,322評(píng)論 0 17
  • 自己封裝的一個(gè)帶進(jìn)度條的WebView,在此分享一下 WebView添加自定義進(jìn)度條;實(shí)現(xiàn)緩存,有網(wǎng)取網(wǎng)絡(luò)數(shù)據(jù),無(wú)...
    一點(diǎn)愁閱讀 729評(píng)論 2 2
  • public class ProgressWebView extends WebView { private Pr...
    0dce86ba3565閱讀 750評(píng)論 0 1
  • 想到視頻錄制,肯定又是運(yùn)用MediaRecorder,這個(gè)類實(shí)在是方便,但是好用的東西一定要慎重,畢竟沒(méi)有那么便宜...
    2c2z0閱讀 2,171評(píng)論 0 2
  • WebView·開(kāi)車指南 2016-08-31BugDev 北京市東城區(qū)首席Bug布道師開(kāi)山之作,一整月交通事故血...
    53c021c38a1d閱讀 935評(píng)論 0 1

友情鏈接更多精彩內(nèi)容