一般來說,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(); } } });
0 意見:
張貼留言