Hello World 進階了 -- 對話視窗
This document is provided as is. You are welcomed to use it for
non-commercial purpose.
Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu
請勿轉貼
到目前為止,我們已經知道要如何在螢幕上排版並放入 GUI 元件,並且說明了事件處理的方式;也就是說,進階版的 Hello World 已經快要完成了。要完成如下圖所示的結果,只差一小步:那就是把訊息放到對話視窗中。

常用的 Android 對話視窗有兩種,一種是 android.widget.Toast,另一種是 android.app.AlertDialog.Builder,我們先介紹 Toast 的作法
- Toast 的用法: 首先先看一下一個範例:
Toast.makeText(HelloName.this, "Hello " + input.getText(), Toast.LENGTH_LONG).show();Toast.makeText().show() 會將 makeText() 所定義的內容以 Toast 的方式顯示出來;而 makeText() 內有三個參數:
- 第一個參數說明該對話視窗出現的畫面;由於對話視窗是出現在"這個"畫面上,也就是 HelloName 的這個物件上,所以第一個參數寫成 HelloName.this。請特別注意,由於 Toast.makeText().show() 敘述寫在內隱類別內,所以 this 前面的 HelloName 不能省略!
- 第二個參數定義該對話視窗的文字內容;這個部分就簡單了,依照之前的說明,第二個參數就寫成 "Hello " + input.getText()。
- 第三個參數定義該對話視窗出現在畫面上的時間;Toast 類別總共定義了兩種,一種是 LENGTH_LONG(出現時間約 4-5 秒),另一種是 LENGTH_SHORT(出現時間約 1-2 秒);至於其所代表的值,請參考 API 文件。

- AlertDialog 的用法: AlertDialog 是一個蠻特別的類別,它不能像其它的類別可以直接利用 new 來產生一個 AlertDialog 的物件,而必須借用 AlertDialog.Builder() 來產生物件。產生 AlertDialog 物件的範例程式如下:
從程式碼可以看得出來:第 01 行產生一個 AlertDialog 物件(或者更明確的說,產生一個 AlertDialog.Builder 物件);第 02 行,借用 setTitle() 來設定這個對話視窗的標題,就像範例程式所示,setTitle() 敘述可有可無,設定之後,其執行結果如下圖所示;第 03 行的 setMessage() 很明顯的是設定對話視窗顯示的訊息;第 10 行是將對話視窗顯示出來,第 11 行是將文字欄位內的資料清除;第 04-09 行是設定對話視窗按鈕的相關資料,其中 setNeutralButton() 代表設定中間的按鈕(一般來說,AlertDialog 有三個按鈕,除了 setNeutralButton 之外,還有 setNegativeButton 和 setPositiveButton),有設定的才會出現),該方法有兩個參數:第一個參數內放的是出現在按鈕內的字串,而第二個參數必須是一個 DialogInterface.OnClickListener 物件。從範例程式碼可以看出,當使用者點選按鈕並不作任何動作,因此 DialogInterface.OnClickListener 內的 onClick() 方法的主體是空的;請注意,這又是另一個匿名內隱類別的用法。如果需要其他的按鈕,其使用方式與 setNeutralButton() 類似,在此就不再贅述。
01 AlertDialog.Builder ad = new AlertDialog.Builder(HelloName.this); 02 ad.setTitle("可有可無"); 03 ad.setMessage("Hello " + input.getText()); 04 ad.setNeutralButton("OK", 05 new DialogInterface.OnClickListener() { 06 public void onClick(DialogInterface dialog, int which) { 07 //不做任何事情 直接關閉對話方塊 08 } 09 }); 10 ad.show(); 11 input.setText("");
- 第01-09 行也可以縮寫成如下的一行敘述,從程式碼可以看出這樣的設計方式連 AlertDialog 物件變成匿名的(之前還需要宣告一個名為 sb 的變數)。究竟程式設計人員應該使用哪種方式就見仁見智了;其實概念通了,這些都不是哪麼重要。
new AlertDialog.Builder(HelloName.this).setTitle("可有可無").setMessage("Hello " + input.getText()).setNeutralButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //不做任何事情 直接關閉對話方塊 } }).show(); - 為了確認剛剛的說明,完整的程式碼如下所示:(請自行練習完成)
public class HelloName extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button button = (Button) findViewById(R.id.button1); button.setOnClickListener(new HelloButton()); } private class HelloButton implements OnClickListener { public void onClick(View view) { EditText input = (EditText) findViewById(R.id.editText1); AlertDialog.Builder ad = new AlertDialog.Builder(HelloName.this); ad.setTitle("可有可無"); ad.setMessage("Hello " + input.getText()); ad.setNeutralButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //不做任何事情 直接關閉對話方塊 } }); ad.show(); input.setText(); } } }
Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu
沒有留言:
張貼留言