要實現的功能
(1) 將WebView加入到你的應用
(2) 使用WebView加載頁面
(3) 獲取網絡訪問權限
(4)在WebView中使用Javascript
(5)處理頁面導航
(6)後退與前進
(7)判斷頁面加載過程
(8)WebView緩存的運用
1.通過Intent調用系統瀏覽器
Uri uri = Uri.parse(url); url爲你要鏈接的地址
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
處理頁面導航
當用戶點擊一個WebView中的頁面的鏈接時,通常,是由默認的瀏覽器打開加載目標URL的,然而,你可以再WebView中覆蓋這一行爲,那麼鏈接就會在WebView中打開。
webView.setWebViewClient(new WebViewClient());
覆蓋WebView默認通過第三方或者是系統瀏覽器打開網頁的行爲,使得網頁可以在webview中打開
在WebView中使用Javascript
如果你想要你加載在WebView中的web頁面使用Javascript,你需要在WebView中啓用Javascript。啓用Javascript你可以通過WebView中帶有的WedSettings來啓用它。你可以通過getSettings()來獲取WebSettings的值,然後通過setJavascriptEnabled()來啓用Javascript。
我們會遇到點擊返回鍵,沒有返回上一頁,而是退出程序的結果,這樣的結果顯然不是hi我們想要的,於是我們要給webview做一個後退和前進的功能:
當你的WebView覆蓋了URL加載,它會自動生成歷史訪問記錄,你可以通過goBack()或goForward()向前或向後訪問已訪問過的站點。
//改寫物理按鍵--返回的邏輯
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK) {
Toast.makeText(this, mWebView.getUrl(), Toast.LENGTH_LONG).show();
if (mWebView.canGoBack()) {
mWebView.goBack(); //返回上一頁
return true;
}else {
System.exit(0);
}
}
return super.onKeyDown(keyCode, event);
}
判斷頁面加載過程:
由於有些網頁可能加載緩慢,所以我們需要去判斷頁面的加載過程,製作進度條給與用戶良好的體驗效果。
mWebView.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
// TODO Auto-generated method stub
super.onProgressChanged(view, newProgress);
if (newProgress == 100) {
//網頁加載完畢
closeDialog();
}else {
//網頁正在加載
openDialog(newProgress);
}
}
private void openDialog(int newProgress) {
// TODO Auto-generated method stub
if (dialog == null) {
dialog = new ProgressDialog(MainActivity.this);
dialog.setTitle("正在加載。。");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setProgress(newProgress);
dialog.show();
}else {
dialog.setProgress(newProgress);
}
}
private void closeDialog() {
// TODO Auto-generated method stub
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
dialog = null;
}
}
});
那麼爲了使我們訪問過的網頁速度加快,我們可以加入緩存的功能
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);