2014-12-05 09:57:52| 發佈人:android_Zero| 瀏覽(377)| 評論(0)html
在WebView的設計中,不是什麼事都要WebView類乾的,有些瑣事是分給其餘人的,這樣WebView專心幹好本身的解析、渲染工做就好了。WebViewClient就是幫助WebView處理各類通知、請求事件的,WebChromeClient是輔助WebView處理Javascript的對話框,網站圖標,網站title,加載進度等。html5
使用WebView時需在AndroidManifest.xml添加以下權限,不然會出Web page not available錯誤。:java
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />(有的甚至要加這個權限)
設置WebView基本信息:android
mWebview.getSettings().setJavaScriptEnabled(true);//設置支持Javascript requestFocus();//若是不設置,則在點擊網頁文本輸入框時,不能彈出軟鍵盤及不響應其餘的一些事件。 this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY); mWebView.loadUrl(「http://www.google.com「); //互聯網用 mWebView.loadUrl(「file:///android_asset/XX.html「);//本地文件用 本地文件存放在:assets文件中
ws.setSupportZoom(true); // support zoom //ws.setDefaultZoom(WebSettings.ZoomDensity.FAR) ; ws.setBuiltInZoomControls(true); //page auto adapter ws.setUseWideViewPort(true); ws.setLoadWithOverviewMode(true);
WebView添加一個事件監&聽對象(WebViewClient)並重寫其中的一些方法shouldOverrideUrlLoading:對網頁中超連接按鈕的響應。當按下某個鏈接時WebViewClient會調用這個方法,並傳遞參數:按下的url。web
mWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //重寫此方法代表點擊網頁裏面的連接仍是在當前的webview裏跳轉,不跳到瀏覽器那邊 view.loadUrl(url); return true; }
//此方法能夠處理webview 在加載時和加載完成時一些操做 mWebView.setWebChromeClient(new WebChromeClient(){ @Override public void onProgressChanged(WebView view, int newProgress) { if(newProgress==100){ // 這裏是設置activity的標題, 也能夠根據本身的需求作一些其餘的操做 title.setText(「加載完成」); }else{ title.setText(「加載中…….」); } } });
參考stackoverflow.瀏覽器
//先在onCreate()方法裏設置icon存儲的路徑 WebIconDatabase.getInstance().open(getDir("icons", MODE_PRIVATE).getPath()); //再設置webview的WebChromeClient mWebView.setWebChromeClient(new MyWebChromeClient()); //最後MyWebChromeClient中重寫如下方法 @Override public void onReceivedIcon(WebView view, Bitmap icon) { if(icon != null ){ mIconImgeView.setImageBitmap(icon); } }
若是用webview點連接看了不少頁之後,若是不作任何處理,點擊系統「Back」鍵,整個瀏覽器會調用finish()而結束自身,若是但願瀏覽的網頁回退而不是退出瀏覽器,須要在當前Activity中處理並消費掉該Back事件。覆蓋Activity類的onKeyDown(int keyCoder,KeyEvent event)方法。緩存
public boolean onKeyDown(int keyCoder,KeyEvent event){ if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){ webview.goBack(); //goBack()表示返回webView的上一頁面 return true; } return false; }
WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);// 優先使用緩存 //WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);//不使用緩存 //退出時刪除緩存,可放到 OnDestory()方法裏 File file = CacheManager.getCacheFileBaseDir(); if (file != null && file.exists() && file.isDirectory()) { for (File item : file.listFiles()) { item.delete(); } file.delete(); } mWebView.clearCache(true); context.deleteDatabase("webview.db"); context.deleteDatabase("webviewCache.db");
/** * 處理長按彈出的上下文菜單事件,包括網頁連接,圖片連接等... */ class Hao123ContextMenuListener implements OnCreateContextMenuListener{ @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { HitTestResult result = ((WebView)v).getHitTestResult() ; if(null == result) return ; int type = result.getType(); if (type == WebView.HitTestResult.UNKNOWN_TYPE) return; if (type == WebView.HitTestResult.EDIT_TEXT_TYPE) { // let TextView handles context menu return; } MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.browser_menu, menu); // Show the correct menu group String extra = result.getExtra(); menu.setGroupVisible(R.id.PHONE_MENU, type == WebView.HitTestResult.PHONE_TYPE); menu.setGroupVisible(R.id.EMAIL_MENU, type == WebView.HitTestResult.EMAIL_TYPE); menu.setGroupVisible(R.id.GEO_MENU, type == WebView.HitTestResult.GEO_TYPE); menu.setGroupVisible(R.id.IMAGE_MENU, type == WebView.HitTestResult.IMAGE_TYPE || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); menu.setGroupVisible(R.id.ANCHOR_MENU, type == WebView.HitTestResult.SRC_ANCHOR_TYPE || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); // Setup custom handling depending on the type Intent intent; switch (type) { case WebView.HitTestResult.PHONE_TYPE: //處理撥號 break; case WebView.HitTestResult.EMAIL_TYPE: //處理Email break; case WebView.HitTestResult.GEO_TYPE: //TODO break; case WebView.HitTestResult.SRC_ANCHOR_TYPE: case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE: case WebView.HitTestResult.IMAGE_TYPE: // 處理長按圖片的菜單項 break; default: break; } } private OnMenuItemClickListener menuItemListener = new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { // TODO 各菜單項事件處理 } }; }
一、判斷是否安裝了flash,若沒有跳轉到市場安裝 http://blog.csdn.net/zircon_1973/article/details/8067041cookie
二、代碼裏設置支持flash播放ide
WebSettings ws = mWebView.getSettings(); ws.setJavaScriptEnabled(true) ; ws.setPluginsEnabled(true); //Flash support if(DeviceInfo.getSDKVersionNumber()>7){ //flash support since android 2.2 ws.setPluginState(PluginState.ON); ws.setAllowFileAccess(true); }
AndroidManifest裏相應的Activity加上以下代碼:網站
android:name=".BrowserActivity" ...... android:hardwareAccelerated="true" ....... >
mWebView.setDownloadListener(new DownloadListener() { public void onDownloadStart(String url, String userAgent,String contentDisposition, String mimetype,long contentLength) { //實現下載的代碼,這裏跳轉到其餘瀏覽器下載 Uri uri = Uri.parse(url); // Uri uri = Uri.parse("http://www.abc.com/a.apk");若是隻下載單個文件 Intent intent = new Intent(Intent.ACTION_VIEW,uri); startActivity(intent); } });
http://blog.csdn.net/jdsjlzx/article/details/7761333
能夠參考這個項目
垂直滾動條老是顯示白色軌跡底圖(沒法消掉) 在xml中給WebView設置一下屬性發覺不起一點做用:
android:fadeScrollbars = "true" android:scrollbarStyle = "outsideOverlay" android:scrollbarAlwaysDrawVerticalTrack = "false"
必須在代碼中對WebView進行設置才能奏效:
webview .setScrollbarFadingEnabled( true ); webview .setScrollBarStyle(View. SCROLLBARS_INSIDE_OVERLAY );
E/Web Console(804): Uncaught TypeError: Cannot call method 'getItem' of null at http://z.cdn.turner.com/cnn/tmpl_asset/static/mobile_phone/2273/js/global-min.js:3
加上如下這句便可:
WebSettings settings = webView.getSettings(); settings.setDomStorageEnabled(true);