CH9 清單與選單
一、ListView ListView的目的是以可捲動清單形式提供一串項目讓使用者從中選擇,這些項目的來源可以是List或陣列,由指定的Adapter自動建立成顯示的清單。 使用ListView的一般步驟如下: 在XML佈局檔中利用<ListView>建立ListView,並設定相關屬性。 以資料來源與清單樣式建立ArrayAdapter物件。
將此ArrayAdapter物件指定給ListView元件。 ListView主要處理的事件是「onItemClick」,這事件在清單項目被敲擊時觸發,並以「AdapterView.OnItemClickListener」偵聽器偵聽。 ListView Test範例 在ListView範例中,當敲下一清單項目,會將此項目的內容顯示在清單上方的TextView中。 詳細內容請參考原書。
ListView元件另一個常用的事件是「onItemSelected」,它對應的偵聽器物件為「OnItemSelectedListener」,必須實作的方法為「onItemSelected(AdapterView<?> parent, View view, int position, long id)」與「onNothingSelected(AdapterView<?> parent)」。
二、 ListActivity ListActivity是一個顯示項目清單,並可以藉由事件與使用者互動的活動,它擁有一個<ListView>元件可以透過Adapter與不同資料來源繫結在一起。 ListActivity有一個預設的佈局,因此可以不必自己設計佈局檔。 另外要注意一點,在Java程式碼中包含清單的活動不再是延伸自Activity,而是延伸自「ListActivity」。
ListAdaptive Test範例 範例中我們不再用Adapter將清單內容繫結至陣列資料,而是繫結至字串資源。 需要注意2點: Adapter的型態需從「String」改為「CharSequence」 。 改用Adapter的「createFromResource()」靜態方法建立Adapter。 createFromResource()方法需要3個參數,第1個參數仍是此物件所在的活動,第2個參數指定資料來源的字串資源,第3個參數則為設定清單的形式。 詳細內容請參考原書(code 9-3)。
三、ExpandableList View 在第1 層的群組是一維的,而第2層的子清單為二維;一般我們會在Java程式中使用「Java.util.List」類別宣告這二層清單,然後透過「Java.util.Map」類別將資料放置於清單內。
ExpandableList Test範例 在清單對應的「SimpleExpandableListAdapter」中指定群組與子清單樣式均為「android.R.layout.simple_expandable_list_item_2」。 使用者敲擊一個子選單項目時,用Toast物件顯示此項目所在群組與子選單索引值。 詳細內容請參考原書。 可展開清單主要處理以下事件: onChildClick事件 子清單項目被敲擊時觸發,需建立OnChildClickListener物件並實作public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id)方法。
onGroupClick事件 onGroupCollapse事件 onGroupExpand事件 組項目被敲擊時觸發,需建立OnGroupClickListener物件並實作public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id)方法。 onGroupCollapse事件 當子清單項目收合時觸發,需建立OnGroupCollapseListener物件並實作public void onGroupCollapse(int groupPosition)方法。 onGroupExpand事件 當子清單項目展開時觸發,需建立OnGroupExpandListener物件並實作public void onGroupExpand(int groupPosition)方法。
四、Spinner 下拉清單(Spinner)提供一組資料項目供使用者選擇,在預設情況下Spinner會顯示目前選擇的項目內容。 當使用者從清單中選擇一個項目,清單將關閉且此項目內容會顯示於Spinner上,同時觸發onItemSelected事件。
要使用下拉清單,應依循以下步驟: Spinner Test範例 在佈局中加入<Spinner>元件。 建立資料來源,從資源檔或Java程式中建立均可以。 建立Adapter與指定清單樣式,常用的樣式佈局有「simple_spinner_item」與「simple_spinner_dropdown_item」。 建立事件處理機制。 Spinner Test範例 Spinner資料來源定義於strings.xml資源檔。 當使用者從清單中敲選一個項目,會以Toast物件顯示所敲項目位置。 詳細內容請參考原書。
Spinner有幾個常用的屬性,值得留意一下: dropDownVerticalOffset:設定清單顯示時與Spinner元件的垂直距離。 dropDownWidth:設定清單顯示的寬度。 popupBackground:設定清單顯示時的背景圖形或顏色。 spinnerMode:設定清單出現的模式,可以設定為「dropdown」下拉式(出現於Spinner下方),或「dialog」以獨自的畫面出現。 取出選項值 變數 = Parent.getItematPosition(pos).ToString;
五、選單 對Android系統而言,選單是Activity的一部份,因此選單的建立必須含在Activity類別定義以內。 Android提供2種形式的選單:選項選單(Option Menu)與文意選單(Context Menu) 。 選單主要處理的方法有2個:建立選單的方法(對2種選單建立所使用的方法不同)與選擇選項後回應的方法。
在選單中加入選項有2種方式,一是透過Java程式碼在建立選單的方法中,逐項將選項加入;另一種方式是先建立選單的XML定義檔,然後在Java程式碼建立選單的方法中引入此定義檔。 當使用者從選項選單選擇一個項目,系統會呼叫活動的onOptionsItemSelected()方法,在這方法中可以使用getItemId()方法取得被選選項id,然後依被選選項進行希望的處理動作。
OptionMenu Test範例 建立含3個選項的選項選單。 選擇選項後呼叫對應的處理方法,都是以Toast顯示被選選項標題。 詳細內容請參考原書(code 9-10)。 執行專案時須按[menu] 才會顯示menu
ContextMenu 功能表選單(ContextMenu) 功能表選單的作用是對特定視圖元件提供處理選擇,當長按住(2秒以上)一個登錄有功能表選單的視圖元件,此功能表選單就會以浮動選單的方式出現。
建立功能表選單的步驟如下: ContextMenu Test範例 用registerForContextMenu()方法為視圖元件登錄文意選單。 在活動類別中實作onCreateContextMenu()方法,當登錄有功能表選單的視圖元件受到長按動作,系統會呼叫此方法建立功能表選單。 當使用者從功能表選單選擇一個項目,系統會呼叫活動的onContextItemSelected()方法,在這方法中可以使用getItemId()方法取得被選選項的id,然後依被選選項進行希望的處理動作。 ContextMenu Test範例 為TextView元件登錄及建立含2個選項的文意選單,而從選單中選擇一個選項會呼叫對應的處理方法,以Toast顯示被選選項標題。 詳細內容請參考原書(code 9-11)。
建立子選單 不論是選項選單或是文意選單都能對其選項建立子選單,建立方式是先用選單的addSubMenu()方法,建立第1層所含子選單的項目,再用這些含子選單項目的add()方法建立第2層選項。 SubMenu Test範例 先在文意選單中加入2個有子選單的項目:編輯與檢查。 編輯的子選單有2個選項(編輯檔案、編輯資料表),而檢查的子選單有3個選項(檢查有效日期、檢查授權、檢查預算)。 詳細內容請參考原書 (code 9-12)。