標籤:
最近工作中,基本一直在用WebView,今天就把它整理下:
WebView 顧名思義,就是放一個網頁,一個看起來十分簡單,但是用起來不是那麼簡單的控制項。
首先你肯定要定義,初始化一個webview,其實網上的例子很多,我這裡就簡單的把一些WebView 中可能會用到的的很重要的屬性以及支援全屏播放視頻該怎麼實現的代碼粘出來,直接放到項目中去就行了
private WebView webview;
webview = (WebView) findViewById(R.id.webview);
// 設定WebView屬性,能夠執行Javascript指令碼
webview.getSettings().setJavaScriptEnabled(true);
//設定WebView 可以載入更多格式頁面
webview.getSettings().setLoadWithOverviewMode(true);
//設定WebView使用廣泛的視窗
webview.getSettings().setUseWideViewPort(true);
//設定WebView的使用者代理程式字串。如果字串“ua”是null或空,它將使用系統預設的使用者代理程式字串
webview.getSettings().setUserAgentString();
//支援手勢縮放
webview.getSettings().setBuiltInZoomControls(true);
//支援2.2以上所有版本
webview.getSettings().setPluginState(PluginState.ON);
//告訴webview啟用應用程式緩衝api。
webview.getSettings().setAppCacheEnabled(true);
//設定是否啟用了DOM storage API。
webview.getSettings().setDomStorageEnabled(true);
//自動開啟視窗
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
// 沒有的話會黑屏 支援外掛程式
webView.getSettings().setPluginsEnabled(true);
/**
* setAllowFileAccess 啟用或禁止WebView訪問檔案資料 setBlockNetworkImage 是否顯示網狀圖像
* setBuiltInZoomControls 設定是否支援縮放 setCacheMode 設定緩衝的模式
* setDefaultFontSize 設定預設的字型大小 setDefaultTextEncodingName 設定在解碼時使用的預設編碼
* setFixedFontFamily 設定固定使用的字型 setJavaSciptEnabled 設定是否支援Javascript
* setLayoutAlgorithm 設定布局方式 setLightTouchEnabled 設定用滑鼠啟用被選項
* setSupportZoom 設定是否支援變焦
* */
// 排版適應螢幕
webView.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
// 設定Web試圖 注意以下兩個方法十分重要,很多需要重寫:
//首先設定自訂的WebChromeClient來設定視頻播放的一些問題
busWiFiWebView.setWebChromeClient(new DefaultWebChromeClient());
busWiFiWebView.setWebViewClient(new DefaultWebViewClientClient());
第一個方法:WebChromeClient:
//要重寫其中的onShowCustomView 方法 表示進入全屏的時候,以及onHideCustomView 表示退出全屏的時候
介面的話,就是一個webview ,一個FrameLayout ,當全屏的時候就設定webview 隱藏,讓FrameLayout全螢幕顯示出來,那麼視頻就自動跑到FrameLayout這裡面放了。退出全屏的時候,一樣道理,這裡要用到回呼函數,自己理解吧。。。我講的不好。。。
private class DefaultWebChromeClient extends WebChromeClient {
// 一個回調介面使用的主應用程式通知當前頁面的自訂視圖已被撤職
CustomViewCallback customViewCallback;
// 進入全屏的時候
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
// 賦值給callback
customViewCallback = callback;
// 設定webView隱藏
webview.setVisibility(View.GONE);
// 聲明video,把之後的視頻放到這裡面去
FrameLayout video = (FrameLayout) findViewById(R.id.video);
// 將video放到當前視圖中
video.addView(view);
// 橫屏顯示
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
// 設定全屏
setFullScreen();
}
// 退出全屏的時候
@Override
public void onHideCustomView() {
if (customViewCallback != null) {
// 隱藏掉
customViewCallback.onCustomViewHidden();
}
// 使用者當前的首選方向
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
// 退出全屏
quitFullScreen();
// 設定WebView可見
webview.setVisibility(View.VISIBLE);
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}
}
下面是兩個方法,設定全屏和退出全屏的方法:注意,我捕捉到了,全屏狀態下和視窗狀態下他們分別的Flags數值。可見如下代碼
/**
* 設定全屏
*/
private void setFullScreen() {
// 設定全屏的相關屬性,擷取當前的螢幕狀態,然後設定全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 全屏下的狀態代碼:1098974464
// 視窗下的狀態嗎:1098973440
}
/**
* 退出全屏
*/
private void quitFullScreen() {
// 聲明當前螢幕狀態的參數並擷取
final WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setAttributes(attrs);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
第二個自訂的WebViewClient,繼承WebViewClient
/**
* 使用系統預設webview
*/
private class DefaultWebViewClientClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
//如果要下載頁面中的遊戲或者繼續點擊網頁中的連結進入下一個網頁的話,重寫此方法下,不然就會跳到手機內建的瀏覽器了,而不繼續在你這個webview裡面展現了
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
//想在收到錯誤資訊的時候,執行一些操作,走此方法
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPagStarted(view, url, favicon);
//想在頁面開始載入的時候,執行一些操作,走此方法
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//想在頁面載入結束的時候,執行一些操作,走此方法
}
}
最後還有一點很重要,要想進入同過webview瀏覽網頁,而且點返回鍵是想在webview中返回,而不是直接退出程式,那麼就得重寫onKeyDown方法。還有
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
WebView webView = (WebView) findViewById(R.id.webview_passenger);
if (webView.canGoBack()) {
// goBack()表示返回WebView的上一頁面
webView.goBack();
//退出全屏
quitFullScreen();
} else {
}
return true;
}
return super.onKeyDown(keyCode, event);
Android WebView使用