CH10 對話框與分頁
對話框的作用是將訊息傳給使用者,它的作用雖然與前面介紹的Toast物件類似 對話框則屬於干擾型的訊息通知者,它出現後使用者將無法繼續目前動作,直到你對出現的對話框完成處理
一、對話框 對話框的基本類別是「Dialog」類別,從它延伸出一些專門用途的對話框 它直接的繼承者警示對話框(AlertDialog) 警示對話框的繼承者日期拾取對話框(DatePickerDialod) 與時間拾取對話框(TimePickerDialod)
建立對話框步驟 建立對話框專用佈局檔,此檔需置於專案的「/res/layout/」目錄 從Dialog類別建立實體物件 加入方式:於專案目錄上右擊,選/New/Android XML File 在跳現視窗輸入如圖10-1資料 從Dialog類別建立實體物件 設定Dialog實體物件的屬性及使用的佈局檔 建立此Dialog實體物件的事件處理機制。 Dialog Test範例詳細內容請參考原書(code 10-2)。
對話框之啟用 在主活動布局檔加入一個Button 將Button之屬性定義如下: <Button android:id="@+id/showbtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textview1" android:layout_alignParentBottom="true" android:layout_marginBottom="82dp" android:layout_gravity="center_horizontal" android:onClick="showDialog" android:text="開啟對話框" />
在MainActivity.java內加入“showDialog” 定義 public void showDialog(View view) { dlg=new Dialog(MainActivity.this); dlg.setTitle("對話框標題"); dlg.setContentView(R.layout.dialog_layout); dlg.setCancelable(false); Button dlgBtn=(Button)dlg.findViewById(R.id.button1); dlgBtn.setOnClickListener(dlgBtnListener); dlg.show(); } 參考自對話框布局檔
二、警示對話框 警示對話框(AlertDialog)最多可以擁有3個按鈕,也可以設定標題,顯示一般訊息或提供清單讓使用者選擇。 警示對話框建置過程如下: 實體化AlertDialog.Builder物件,並指定它的擁有者。 AlertDialog.Builder builder= new AlterDialog.Builder(擁有者類別.this);
設定所要建立對話框的標題、圖示、訊息、清單內容等屬性(但Android 4 設定所要建立對話框的標題、圖示、訊息、清單內容等屬性(但Android 4.0以後對話框已不顯示圖示),另外最好將Cancelable屬性設為false,讓使用者無法用裝置的「Back」鈕離開對話框。 builder.setTitle(“對話框標題”); builder.setIcon(android.R.drawable.圖示檔名); builder.setMessage(“對話框訊息”); builder.setSingleChoiceItems(string, index, listener); builder.setCancelable(false);
AlertDialog Test範例詳細內容請參考原書(code 10-4)。 設定對話框上的按鈕;對話框上最多可以有3個按鈕,分別以setPositiveButton(確定)、setNegativeButton(放棄)與setNeutralButton(取消)等方法設定。 builder.setPositiveButton(“標題”, 按鈕事件偵聽器); builder.setNegativeButton(“標題”, 按鈕事件偵聽器); builder.setNeutralButton(“標題”, 按鈕事件偵聽器) 用Builder的create()方法建立警示對話框並顯示。 AlertDialog dlg=builder.create(); dlg.show(); AlertDialog Test範例詳細內容請參考原書(code 10-4)。
SingleChoiceDlg Test範例 單選清單 SingleChoiceDlg Test範例 示範單選清單式警示對話框的使用。 以TextView元件顯示在清單中所選項目的索引,對話框仍以按鈕關閉。 範例詳細內容請參考原書(code 10-6)。
如果要設定的對話框內容為「簡單清單」,使用setItems(資料來源, OnClickListener)方法,簡單清單式對話框在點選清單項目後會自動關閉,因此不必提供按鈕。 如果對話框內容要設定的是「多選清單」,則使用setMultiChoiceItems(資料來源, [], OnMultiChoiceClickListener),但多選與單選清單對話框都屬於持久性對話框,敲選清單項目後不會關閉對話框,因此必須如同一般警示對話框般另外提供按鈕來關閉對話框。
三、日期與時間設定 日期(DatePickerDialog)與時間拾取對話框(TimePickerDialog)屬於比較特殊的對話框,作用是提供預先設計好的介面讓使用者從中挑選日期或時間。 使用方式如下: 從DatePickerDialog或TimePickerDialog建立對話框實體物件。 以OnDateSetListener的onDateSet()方法設定日期,或以OnTimeSetListener的onTimeSet()方法設定時間。 用show()方法顯示對話框。
DateTimePicker Test範例 在佈局中加入一個TextView元件,用以顯示使用者挑選的日期或時間;另外加入2個按鈕,一個用以開啟DatePickerDialog,另一個開啟TimePickerDialog 。 執行時當使用者挑好日期或時間,按下對話框的「Done」按鈕,會觸發onDateSet或onTimeSet方法,我們透過建立的OnDateSetListener與OnTimeSetListener物件處理此事件(取得及顯示挑選的日期或時間)。 範例詳細內容請參考原書(code 10-8) 。
Android SDK也提供DatePicker與TimePicker視圖元件方便開發者使用。 DatePicker當選擇的日期改變時,會觸發onDateChanged事件,因此可以建立OnDateChangedListener偵聽器,實作onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth)方法處理此事件。 DatePicker可以用getYear()、getMonth()、getDayOfMonth()等方法取得目前挑選的日期,用updateDate(int year, int month, int dayOfMonth)方法更新目前挑選的日期。
TimePicker當選擇的時間改變時,會觸發onTimeChanged事件,因此可以建立OnTimeChangedListener偵聽器,實作onTimeChanged(TimePicker view, int hour, int minute)方法處理此事件。 TimePicker可以用setIs24HourView(boolean)方法設定是否採24小時制,以getCurrentHour()、getCurrentMinute()等方法取得目前挑選的時間,用setCurrentHour(int)、setCurrentMinute(int)方法更新目前挑選的時間。
TimePickerWidget Test範例 示範TimePicker視圖元件的使用,挑選的時間以TextView元件顯示。 範例詳細內容請參考原書(code 10-10) 。
四、進度顯示對話框 進度顯示對話框(ProgressDialog),提供有進度百分比的長條式進度顯示模式(也能設定次進度顯示),與不確定進度值的旋轉環式進度顯示。 進度顯示對話框不具備任何按鈕,是以完成工作為指標關閉進度顯示對話框,因此一般多用於多執行緒模式,一個執行緒在幕後持續進行此對話框在意的工作,另外還要有一個執行緒負責監視此工作進度並更新進度顯示對話框的進度指示(對長條式)。
建立進度顯示對話框須從ProgressDialog類別實體化為物件,並以擁有者為參數初始化 以setTitle(CharSequence[])方法設定標題 以setMessage(CharSequence[])方法設定顯示的訊息 以setIndeterminate(Boolean)設定進度顯示的模式 以setCanceable(Boolean)設定裝置的「Back」鈕能否關閉對話框 最後以show()方法顯示進度顯示對話框。 ProgressDialog dialog= new ProgressDialog(MainActivity.this); dialog.setTitle("ProgressDialog Demo"); dialog.setMessage("進行中...."); dialog.setIndeterminate(true); dialog.setCanceable(true); dialog.show();
五、分頁設計 分頁設計(Tab)的畫面讓我們在有限的空間中顯示更多的視圖,它讓使用者利用點選不同頁面標籤,可以迅速更換不同的顯示畫面。 分頁設計的核心是「TabHost」,它是分頁視圖的容器,負責管理整個分頁視圖架構。它有2個子物件,一是「頁標籤集合」,使用者利用點選此標籤換至想要的頁面,這集合受「TabWidget」控制;另一個是「FrameLayout」,它的作用是容納每一頁內所有視圖元件。
分頁設計有2種建立方式,一是用一個XML佈局檔規劃所有頁面內容;也可以各別建立各頁的XML佈局檔,然後用Intent載入指定頁面(如同在不同活動之間更換)。目前我們將採第一種方法。 用佈局檔規劃所有頁面,我們應以<TabHost>為最上層元件,接著加入負責頁面管理的<TabWidget>元件,注意它的識別碼一定要設成「tabs」 ,再來是加入容納每一頁面的<FrameLayout>元件,也要注意它的識別碼一定要設成「@android:id/tabcontent」。
各頁的設計,設計方式與一般單頁活動畫面相同,也是選一種佈局方式(各種佈局方式都可以),然後在佈局中加入需要的視圖元件,需要留意的是佈局也要設定有自己的識別碼,另外最好設定「android:paddingTop」屬性,讓頁面佈局與頁面標籤有些距離。 Tab Test範例 為一個3頁的分頁佈局,第1、3頁採線性佈局,第2頁改採相對佈局,頁面佈局與頁面標籤有100dp的距離。 範例詳細內容請參考原書(code 10-12)。