2012年9月28日 星期五

如何把時鐘和文字放在同 一個畫面?

如何把時鐘和文字放在同一個畫面?

This document is provided as is. You are welcomed to use it for non-commercial purpose.
Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu
請勿轉貼

現在你已經知道怎麼把文字(也就是 Hello World)或者時鐘(剛剛的練習題)放到螢幕上,可是怎麼把兩個以上的 GUI 元件放到螢幕上呢?說明 setContentView() 的時候,我們說明了該方法只能有一個參數,而且該參數必須是 View 或者其子類別的物件,這項限制也說明了:如果利用這樣的方式使用 setContentView(),只有一個 GUI 元件可以顯示在螢幕上。為了瞭解是否能解決這種限制,除了搜尋之外,另一個方式就是找 API 文件。


如果物件導向的概念清楚的話,找的方式蠻簡單的:就是找 View 的子類別。翻了一下,我們找到了 ViewGroup 類別,一看到 Group 大概可以推測它可以由一群 View 組成。仔細檢查 ViewGroup 卻又發現它是一個抽象類別(abstract class),因此程式無法直接產生一個 ViewGroup 的物件。那麼有沒有 ViewGroup 的子類別,且該類別不是抽象類別呢?所以再翻一下文件,立即看到了一個名為 LinearLayout 的類別。顧名思義,Layout 是排版,所以把兩個以上的 GUI 元件利用某種方式來排列還蠻合理的,因此本文件就利用 LinearLayout 來排版。
本範例的原始碼如下所示,由於程式的其他部分幾乎都跟 Hello World 程式相同,相同的部分我們就不再列示。
01  LinearLayout vg = new LinearLayout(this);
02  AnalogClock av = new AnalogClock(this);
03  TextView tv = new TextView(this);
04  tv.setText("我要出運了");
05  vg.addView(av);
06  vg.addView(tv);
07  setContentView(vg);
程式的第 01、02、以及 03 行分別產生了一個名為 vg、av、以及 tv 的物件,且其資料型態分別是 LinearLayout、AnalogClock、以及 TextView;第 04 行將 tv 物件的文字內容設定為"我要出運了", 然後在第 05 和 06 行,利用 vg 的 addView() 方法分別把 av 和 tv 加到 vg 物件內;最後,我們就可以在第 07 行利用 setContentView() 把 vg 設定到畫面上。
LinearLayout 的排版方式很簡單,它將所有其內含的所有 GUI 元件以一列或者一欄的方式(預設的方式是"列"),然後依據 GUI 元件加入(addView())的先後順序顯示出來。執行上列程式的結果如下 所示:
練習題: LinearLayout 的預設排版方式是以一列排放 GUI 元件,若想以一欄的方式排列必須藉由 setOrientation() 來改變;若想設定列的方式排放,其參數值為 0;反之,其參數值為 1。請試著以欄的方式 排列 GUI 元件。

其實依據本文件的方式使用 setContentView(),並不能讓開發 Android 程式的工作變得簡單而又有彈性(例如變更語系),因此如果要擺放多個 GUI 元件的時候,作者並不建議如此作。我們會在未來的教材中,說明真正 Android 建議的方式。

Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu

沒有留言:

張貼留言