Android WebView學習,創建步驟並附代碼(Handler、線程、WebView結合)

 

WebView允許您爲一個Web頁面創建一個您自己的窗口。今天,我將創建一個簡單的能夠包含一個Web頁面的Activity。

1.       新建一個項目:HelloWebView.

2.       打開res/layout/main.xml。編輯:

  <?xml version="1.0" encoding="utf-8"?>

<WebView xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:id="@+id/webView"

    >

</WebView>


3.       打開HelloWebView.java,並添加內容,如下:

4.       由於要訪問網絡,所以需要在AndroidMainfest.xml添加權限:

<uses-permission android:name="android.permission.INTERNET" />

5.       在AndroidMainfest.xml中設置一下爲沒有標題的界面:
<activity android:name=".HelloWebViewActivity" android:label="@string/app_name"
     android:theme="@android:style/Theme.NoTitleBar">


6.       這樣就能運行了,只不過是一個簡單的Web界面。還需要設置些其他的東西,如重寫一個WebViewClient類,這樣這個Activity就能處理自己的URL request了。

7.       在HelloWebViewActivity類中添加下面的內部類

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}

8.       然後在onCreate(Bundle)方法中添加下面代碼:
mWebView.setWebViewClient(new HelloWebViewClient());

9.       重寫BACK按鍵。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
        mWebView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);


10.下面運行程序就行了。

運行結果如圖所示:

下面是我參考網上寫的代碼:

package com.covics.zfh;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class HelloWebViewActivity extends Activity {
	
	public static final int PROGRESS = 0;
	public static final int WEBVIEW = 1;
	private WebView mWebView;
	private Handler mHandler;
	private ProgressDialog mProgressDialog;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
        loadView(mWebView, "http://write.blog.csdn.net/postlist");
        
        /* 定義一個Handler用於處理下載線程與UI間通訊 */
        mHandler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				
				if (!Thread.currentThread().isInterrupted()){
					switch (msg.what) {
					case PROGRESS :
						/* 顯示進度條*/
						mProgressDialog.show();
						break;
					case WEBVIEW :
						/* 隱藏進度條.注意不用dismiss(),cancel()方法,否則再次調用show()時,進度中的小圓圈將不會轉動 */
						mProgressDialog.hide();
						break;
					default :
						break;
					}
				}
				super.handleMessage(msg);
			}
        };
    }
    /**
     * @description 初始化WebView控件,並初始化ProgressDialog進度條
     * 
     * @throws NullPointerException
     * 
     */
    private void init(){
    	mWebView = (WebView)findViewById(R.id.webView);
    	mWebView.getSettings().setJavaScriptEnabled(true);
    	/* 設置滾動風格,爲0指不給滾動留空間 */
    	mWebView.setScrollBarStyle(0); 
    	mWebView.setWebViewClient(new WebViewClient(){

			@Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				loadView(view, url); /* 調用loadView()方法 */
				return true;
			}
    	});
    	
    	mWebView.setWebChromeClient(new WebChromeClient(){

			@Override
			public void onProgressChanged(WebView view, int newProgress) {
				if (100 == newProgress){ /* 進度到100時轉到WebView頁面*/
					mHandler.sendEmptyMessage(WEBVIEW);
				}
				super.onProgressChanged(view, newProgress);
			}
    	});
    	/* 新建一進度條 */
    	mProgressDialog = new ProgressDialog(HelloWebViewActivity.this);
    	/* 設置進度條樣式  STYLE_SPINNER是圓形的, STYLE_HORIZONTAL是條開的  */
    	mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    	mProgressDialog.setMessage("loading...");
    }
    
    /* 退出軟件 */
    private void cofirmExit(){
    	AlertDialog.Builder builder = new AlertDialog.Builder(HelloWebViewActivity.this);
    	builder.setTitle("退出軟件")
    		.setMessage("是否退出軟件?")
    		.setPositiveButton("是", new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					/* 取消進度條,否則關閉軟件時會報錯 */
			    	mProgressDialog.cancel(); 
			    	/* 調用finish()方法,退出程序 */
					HelloWebViewActivity.this.finish();  
				}
    		})
    		.setNegativeButton("否", new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					/* 若選擇否則不需要填寫代碼 */
				}
			}).show(); /* 記得調用show()方法,否則顯示不出來Dialog */
    }
    
    /**
     * 
     *	@exception 顯示webview頁面.
     *	
     *	@author admin
     *	@param WebView, String
     *	@throws Exception
     *
     */
    private void loadView(final WebView webView, final String url){
    	new Thread(){
			@Override
			public void run() {
				/* 發送一個空消息,用於通知顯示Progress. */
				mHandler.sendEmptyMessage(PROGRESS);
				/* webView加載頁面 */
				webView.loadUrl(url);
				super.run();
			}
    		
    	}.start();
    }
    
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
			/* 用戶按返回鍵,如果可返回則回退 */
			System.out.println("test onKeyDown-->1");
			mWebView.goBack();
			return true;
		} else if (keyCode == KeyEvent.KEYCODE_BACK){
			/* 用戶按返回鍵,若不可返回時則退出程序 */
			System.out.println("test onKeyDown-->2");
			cofirmExit();
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}
    
}


結果如下圖所示:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章