Re: [問題] 程式寫法請教

作者: givemepass (λ)   2014-09-15 13:30:26
※ 引述《zxc190 (卡卡)》之銘言:
: 今天我在一個A class有個 function
: public static void ShowAlert(String msg,Activity activity){
: AlertDialog.Builder alert = new AlertDialog.Builder( activity );
: alert.setTitle("");
: alert.setMessage(msg);
: alert.setPositiveButton("確定", new DialogInterface.OnClickListener() {
: @Override
: public void onClick(DialogInterface arg0, int arg1) {
: }
: });
: alert.show();
: }
: 這樣以後我只想秀alert 就可以A.ShowAlert("訊息",Activity);
: 現在問題來了 如果我想要在一些狀況下按完確定後可以另外做一些事情
: 我要如何Override按完後的function
其實很簡單,寫一個callback就解決惹
首先宣告一個interface
public interface OnDialogListener{
public void OnDialogClick();
}
接著宣告一個變數
private OnDialogListener mOnDialogListener;
在宣告一個註冊的方法
public void setOnDialogListener(OnDialogListener listener){
mOnDialogListener = listener;
}
然後就可以在這個類別使用它惹
假設你的類別是A類別
public class A{

public interface OnDialogListener{
public void OnDialogClick();
}
private OnDialogListener mOnDialogListener;
public void setOnDialogListener(OnDialogListener listener){
mOnDialogListener = listener;
}

public static void ShowAlert(String msg,Activity activity){
AlertDialog.Builder alert = new AlertDialog.Builder(activity);
alert.setTitle("");
alert.setMessage(msg);
alert.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
//當你按下確定以後 就會執行你想要執行的動作

//判斷是否有註冊 如果沒註冊就不用執行
if(mOnDialogListener != null){
mOnDialogListener.OnDialogClick();
}

}
});
alert.show();
}
}
好了 接著就是怎麼使用A類別這個callback
假設現在有一個B類別
class B {
private A a;
public B(){
a = new A();
a.setOnDialogClickListener(new OnDialogClickListener(){
public void OnDialogClick(){
//就是在這邊執行當你按下確定的時候想做的事情
}
});
}
}
這樣就是一個簡單的callback 但是只有對一個註冊有效
後面還有很多變化 例如可以獨立出一個類別專門讓人在註冊
當所有註冊的物件 在某些事情發生變化的時候 就可以群體通知
當然android你也可以用廣播來完成
(如果需要我在寫一個範例for多個註冊的)
這也是一種設計模式 叫做"觀察者模式"
ps. 程式碼沒跑過 可能有那裡漏掉 再告知 謝謝
作者: zxc190 (卡卡)   2014-09-15 14:19:00
感謝指導!實做出來了 感謝! 只是我function是宣告成static所以變量也要是static 沒處理好會變成按確定都做那件事看來得把static拿掉每次都new比較安全了 再次謝謝

Links booklink

Contact Us: admin [ a t ] ucptt.com