Hello World 進階了 -- 對話視窗

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() 內有三個參數:

    1. 第一個參數說明該對話視窗出現的畫面;由於對話視窗是出現在"這個"畫面上,也就是 HelloName 的這個物件上,所以第一個參數寫成 HelloName.this。請特別注意,由於 Toast.makeText().show() 敘述寫在內隱類別內,所以 this 前面的 HelloName 不能省略!
    2. 第二個參數定義該對話視窗的文字內容;這個部分就簡單了,依照之前的說明,第二個參數就寫成 "Hello " + input.getText()。
    3. 第三個參數定義該對話視窗出現在畫面上的時間;Toast 類別總共定義了兩種,一種是 LENGTH_LONG(出現時間約 4-5 秒),另一種是 LENGTH_SHORT(出現時間約 1-2 秒);至於其所代表的值,請參考 API 文件。
    由於這個用法還蠻簡單的,我們就不提供原始碼了,請自行修改。修改完成後,執行的畫面如下:

     

    AlertDialog 的用法: AlertDialog 是一個蠻特別的類別,它不能像其它的類別可以直接利用 new 來產生一個 AlertDialog 的物件,而必須借用 AlertDialog.Builder() 來產生物件。產生 AlertDialog 物件的範例程式如下:
    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 行產生一個 AlertDialog 物件(或者更明確的說,產生一個 AlertDialog.Builder 物件);第 02 行,借用 setTitle() 來設定這個對話視窗的標題,就像範例程式所示,setTitle() 敘述可有可無,設定之後,其執行結果如下圖所示;第 03 行的 setMessage() 很明顯的是設定對話視窗顯示的訊息;第 10 行是將對話視窗顯示出來,第 11 行是將文字欄位內的資料清除;第 04-09 行是設定對話視窗按鈕的相關資料,其中 setNeutralButton() 代表設定中間的按鈕(一般來說,AlertDialog 有三個按鈕,除了 setNeutralButton 之外,還有 setNegativeButton 和 setPositiveButton),有設定的才會出現),該方法有兩個參數:第一個參數內放的是出現在按鈕內的字串,而第二個參數必須是一個 DialogInterface.OnClickListener 物件。從範例程式碼可以看出,當使用者點選按鈕並不作任何動作,因此 DialogInterface.OnClickListener 內的 onClick() 方法的主體是空的;請注意,這又是另一個匿名內隱類別的用法。如果需要其他的按鈕,其使用方式與 setNeutralButton() 類似,在此就不再贅述。

     

    第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

沒有留言:

張貼留言