1. 程式人生 > >1. 顯示Web資訊

1. 顯示Web資訊

1.1 問題

在應用程式中,需要將從Web上獲取的HTML或影象資料不加任何修改和處理地顯示出來。

1.2 解決方案

(API Level 3)
在WebView中顯示資訊。WebView是一個檢視小部件,在應用程式中,它可以嵌入到任何佈局中來顯示本地或遠端的網頁內容。WebView基於開源的WedKit引擎,而Android Browser應用程式也是基於此引擎,所以兩者賦予Web應用程式的效能和功能。

1.3 實現機制

除了最重要的二維滾動(橫向和縱向同時滾動)和變焦控制,WebView對於顯示從網上下載的資源還要很多值得稱道的地方。WebView非常適合處理大圖片,如體育場的地圖,使用者在瀏覽此類圖片時可能需要進行左右平移和縮放。在這裡,我們將討論如何實現本地和遠端資源的顯示。

1. 顯示一個URL

最簡單的情況就是提供資源的URL,然後在WebView中將與該URL對應的HTML頁面或影象顯示出來。以下是這項技術在應用程式中一些小的實際應用:

  • 在應用程式中訪問企業網站。
  • 通過一臺Web伺服器顯示實時更新內容的頁面,如FAQ部分,這個頁面的內容不必升級應用程式就可以動態更新。
  • 顯示一個很大的影象資源,使用者可能需要通過平移/縮放來與它互動。

讓我們來看一個載入常見頁面的簡單示例,不過不是用瀏覽器,而是在Activity內部載入(參見以下兩段程式碼清單)。
包含一個WebView的Activity

public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        WebView webview = new WebView(this);
        //啟用JavaScript支援 
        webview.getSettings().setJavaScriptEnabled(true);
        webview.loadUrl("http://www.baidu.com/");

        setContentView(webview);
    }
}

注意:
預設情況下,WebView是禁用JavaScript支援的。如果顯示的內容需要它的話,可以使用WebView.WebSettings物件來啟用它。

在AndroidManifest.xml中設定需要的許可權

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.examples.webview"
    android:versionCode="1"
    android:versionName="1.0" >

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

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
         <activity
             android:name=".MyActivity"
             android:label="@string/label_web" >
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
    </application>

</manifest>

要點:
如果WebView載入的是遠端內容,AndroidManifest.xml必須宣告使用androd.permission.INTERNET許可權。

載入結果是在Activity中顯示一個HTML顯示(如下圖所示)。
WebView中的HTML頁面

注意,如果點選此檢視中的任意連結,裝置的瀏覽器應用程式就會啟動。這是因為載入的所有網頁URL都預設被系統處理為Intent。如果要在內部處理連結,就必須截斷這些事件。

2. 顯示本地資源

WebView在顯示本地內容時也非常有用,它可以利用HTML/CSS來格式化內容或者為它的內容提供平移/縮放功能。你也許會使用Android專案的assets目錄來儲存你想在WebView中顯示的資源,如大型圖片或HTML檔案。為了更好地組織資源,也可以在assets目錄下建立子目錄來儲存檔案。
通過file://android_asset/這樣的URL格式,WebView.loadUrl()可以顯示儲存在assets目錄中的檔案。例如,如果在assets目錄中存放了檔案android.jpg,使用file://android_asset/images/android.jpg目錄中存放了一個同樣的檔案,WebView可以使用file://android_asset/images/android.jpg這樣的URL來載入它。
另外,WebView.loadData()可以將儲存在字串資源或變數中的原始HTML程式碼載入到檢視中。通過這些技術,預先格式化的HTML文字可以儲存在res/values/strings.xml中或使用遠端API下載下來,並顯示在應用程式中。
以下兩段程式碼清單顯示了一個示例Activity,它有兩個WebView小部件,其中一個垂直堆疊在另一個之上。上面的檢視顯示了一張儲存在assets目錄中的大型圖片,下面的檢視則顯示了儲存在應用程式的字串資源中的一個HTML字串。

res/layout/mian.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <WebView
        android:id="@+id/upperview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <WebView
        android:id="@+id/lowerview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>
</LinearLayout>

顯示本地Web內容的Activity

public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        WebView upperView = (WebView) findViewById(R.id.upperview);
        // 必須啟用縮放功能
        upperView.getSettings().setBuiltInZoomControls(true);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            //Android 3.0+ 以上版本具有捏動縮放功能,無需此按鈕
            upperView.getSettings().setDisplayZoomControls(false);
        }
        upperView.loadUrl("file:///android_asset/android.jpg");

        WebView lowerView = (WebView) findViewById(R.id.lowerview);
        String htmlString = "<h1>Header</h1><p>This is HTML text<br /><i>Formatted in italics</i></p>";
        lowerView.loadData(htmlString, "text/html", "utf-8");
    }

}

在Activity顯示時,兩個WebView將螢幕分為上下兩部分。HTML字串按預期的格式顯示,而大型圖片則可以水平和垂直滾動,使用者甚至可以進行放大和縮小,如下圖所示。
顯示本地資源的兩個WebView

我們通過setBuiltInZoomControls(true)允許使用者縮小和放大內容。預設情況下,這還會顯示與可點選的縮放控制元件重疊的按鈕。在Android3.0和以後的版本中,你可能額外考慮包括WebView.getSettings().setDisplayZoom(false)。這些版本的平臺通過收縮手勢原生支援縮放,因此沒有必要顯示重疊按鈕。這種方式不會取代setBuiltInZoomControls(),必須同時支援該方法才可以使收縮手勢生效。