一般來說,AlertDialog 內建三種按鈕方法,分別為 setPositiveButton, setNegativeButton, setNeutralButton,設計者可以根據不同的按鈕,實做個別的 onClickListener 來處理按鈕行為。但這三個按鈕按下後一致的結果就是:關閉 AlertDialog。這對於需要在按下按鈕進行一些資料判斷,若資料不符則不允許關掉 AlertDialog 的設計上,是一大麻煩。好在搜尋到網路上武林高手提供的解法,筆記於下。
首先是標準的 AlertDialog 定義內容,需注意此行,省略了 setPositiveButton 第二個參數 onClickListener 的實做,真正的實做定義於下方。
新建一個 AlertDialog alert,因為原本的 AlertDialog.Builder alertDialog 並沒有 dismiss() 方法。因此程式最後將會利用 alert.dismiss() 來關閉畫面。另外,也需要靠 alert.getButton() 方法取得 PositiveButton 的按鈕控制,這也是 AlertDialog.Builder 沒有提供的方法。特別注意的是,如同註解所示,alert.show() 必須在下一行 button 的存取前呼叫,否則會有 exception 出現。
定義一個 Button,並使用 alert.getButton(AlertDialog.BUTTON_POSITIVE) 取得控制。接著就是正常的 button.setOnClickListener 的定義了。在 onClick 的實做中,可以任意進行資料判斷,如果有需要關閉畫面,呼叫 alert.dismiss() 即可。
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(); } } });