2013年6月20日 星期四

[Android] 按下 PositiveButton 時,如何控制 AlertDialog 關閉與否

一般來說,AlertDialog 內建三種按鈕方法,分別為 setPositiveButton, setNegativeButton, setNeutralButton,設計者可以根據不同的按鈕,實做個別的 onClickListener 來處理按鈕行為。但這三個按鈕按下後一致的結果就是:關閉 AlertDialog。這對於需要在按下按鈕進行一些資料判斷,若資料不符則不允許關掉 AlertDialog 的設計上,是一大麻煩。好在搜尋到網路上武林高手提供的解法,筆記於下。

   View view = View.inflate(this, R.layout.activity_indicate, null);
   final EditText edittextIndicate = (EditText)view.findViewById(R.id.edittext_indicate);
   
   AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
   alertDialog.setTitle("指定密碼");
   alertDialog.setMessage("輸入指定密碼");
   alertDialog.setCancelable(false);
   alertDialog.setView(view);
   alertDialog.setPositiveButton("OK", null); // 真正覆寫內容重新定義於下
   alertDialog.setNegativeButton("Cancel", null);
   
   final AlertDialog alert = alertDialog.create();
   alert.show(); // 取代原本的 alertDialog.show(); 必須在 button 存取之前呼叫
   Button button = alert.getButton(AlertDialog.BUTTON_POSITIVE);
   button.setOnClickListener(new View.OnClickListener() {
    
    @Override
    public void onClick(View v) {
     if(!"".equals(edittextIndicate.getText().toString().trim())) {
      finalNumber = Integer.valueOf(edittextIndicate.getText().toString().trim());
     
      alert.dismiss();
     }
    }
   });


首先是標準的 AlertDialog 定義內容,需注意此行,省略了 setPositiveButton 第二個參數 onClickListener 的實做,真正的實做定義於下方。
alertDialog.setPositiveButton("OK", null); // 真正覆寫內容重新定義於下


新建一個 AlertDialog alert,因為原本的 AlertDialog.Builder alertDialog 並沒有 dismiss() 方法。因此程式最後將會利用 alert.dismiss() 來關閉畫面。另外,也需要靠 alert.getButton() 方法取得 PositiveButton 的按鈕控制,這也是 AlertDialog.Builder 沒有提供的方法。特別注意的是,如同註解所示,alert.show() 必須在下一行 button 的存取前呼叫,否則會有 exception 出現。
   final AlertDialog alert = alertDialog.create();
   alert.show(); // 取代原本的 alertDialog.show(); 必須在 button 存取之前呼叫


定義一個 Button,並使用 alert.getButton(AlertDialog.BUTTON_POSITIVE) 取得控制。接著就是正常的 button.setOnClickListener 的定義了。在 onClick 的實做中,可以任意進行資料判斷,如果有需要關閉畫面,呼叫 alert.dismiss() 即可。
   Button button = alert.getButton(AlertDialog.BUTTON_POSITIVE);
   button.setOnClickListener(new View.OnClickListener() {
    
    @Override
    public void onClick(View v) {
     if(!"".equals(edittextIndicate.getText().toString().trim())) {
      finalNumber = Integer.valueOf(edittextIndicate.getText().toString().trim());
     
      alert.dismiss();
     }
    }
   });

1 則留言:

  1. hi, 因為沒有找到留言板,所以權且留言在這了。
    之前你表示「最新回應」最新版本無法顯示,我想我找到原因了,請參考「Blogger 最新回應+留言者頭像+文章標題」→「2013.7.9 公告」的部分,以及【留言 #33】的回答,應該就能解決了。

    回覆刪除