[Android] AlertDialog-加入多選列表並取得選擇結果(Multi choice list)


Android手機的鬧鐘是大家常使用的功能,在選擇鬧鐘重複的週期時,畫面會跳出AlertDialog顯示星期一至星期日的選項List供使用者選擇多個時間點,今天要介紹的是如何在AlertDialog中加入Multi Choice List,並在使用者選擇Dialog的確認按鈕後,顯示所選擇的內容,這裡將以鬧鐘選擇週期日子的功能為例。


範例情境:

主畫面有個按鈕「選擇星期」,使用者點選後會出現具有Multi Choice List的AlertDialog,有多個時間人選擇,在按下Dialog「確認」按鈕後,系統將會顯示一個Toast訊息,內容為剛才所選擇的時間。

程式碼說明:

一、取得「選擇星期」按鈕物件參考後,註冊其OnClickListener函式,負責顯示具有Multi choice List的AlertDialog
//取得按鈕參考
Button dialogBtn = (Button)findViewById(R.id.dialogBtn);
//register click event listener
dialogBtn.setOnClickListener(onClick);
二、在OnClickListener使用setMultiChoiceItems(items, checkedItems, listener)在AlertDialog加入多選列表,items參數為一個陣列,其代表顯示在List的每個item名稱,checkedItems代表List item的預設勾選狀態,最後是listener負責處理使用者選擇任一個item時所要執行的動作。
CharSequence[] item = {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
boolean[] isChecked = new boolean[day.length];

/**選擇星期按鈕OnClick Listener*/
private View.OnClickListener onClick = new View.OnClickListener() {  
  @Override
  public void onClick(View v) {
  //Display a dialog with a multi choice list
  new AlertDialog.Builder(MultiChoiceDialog.this)
  .setTitle("重複日期")
  .setMultiChoiceItems(day, isChecked, onChoice)
  .setNegativeButton("確認", showSelectedResult)
  .setNeutralButton("取消", null)
  .create()
  .show();   
  }
};
三、在完成按下按鈕顯示Dialog的部份後,接下來要處理User按下多選列表而所要執行的動作,在實作OnMultiChoiceClickListener的內容中,我們將使用者所選擇的item status進行狀態更新。
private OnMultiChoiceClickListener onChoice = new OnMultiChoiceClickListener(){
  @Override
  public void onClick(DialogInterface dialog, int position, boolean checked) {
  //更新目前的選項checked status
  isChecked[position] = checked;
  }
};
四、最後,實作AlertDialog確認按鈕的DialogIterface.OnClickListener(),在按下確認後檢查每個item的checked狀態,如果為被勾選的狀態,就加入顯示結果中。
/**顯示User選擇結果*/
private DialogInterface.OnClickListener showSelectedResult = new DialogInterface.OnClickListener(){
  @Override
  public void onClick(DialogInterface dialog, int which) {
  String result = "你選擇了:";
  for(int i=0;i< item.length;i++){
    if(isChecked[i]==true){
      result = result+","+item[i];
    }
  }
  //顯示選擇的星期
  Toast.makeText(MultiChoiceDialog.this, result, 3000).show();
  }
};
最後在使用選擇幾個選項後,按下確認將會看到一個訊息顯示選擇的內容

留言

這個網誌中的熱門文章

[Android] layout_weight的妙用-讓View的大小以百分比率顯示(proportionate size)

[Android] 內部儲存體(Internal Storage)的檔案系統讀寫(File I/O)

【海外婚紗】造型篇-我的超人新祕Sunny-Yang