一、首先定義監聽函數
public interface OnKeyValueListener { void getKeyValueClick(String value); }
二、在需要傳遞內容的 A類 中傳入該監聽對象
2.1 獲取監聽
public class MyButton {
public MyButton(Context context) {
}
private OnKeyValueListener mOnkeyValueListener; //定義監聽接口,接受Main類傳過來的監聽對象
//模擬用戶觸摸屏幕時系統底層進行的操作
public void doClick() {
mOnkeyValueListener.getKeyValueClick("點擊了A"); //該方法可以在A類跟Main類中調用,都會將內容傳給Main類。這句話就實現了監聽的效果
}
public OnKeyValueListener getmOnkeyValueListener() {
return mOnkeyValueListener;
}
public void setmOnkeyValueListener(OnKeyValueListener mOnkeyValueListener) {
this.mOnkeyValueListener = mOnkeyValueListener; //Main類中調用該方法,傳入監聽對象
}
}
2.2 傳遞內容
在該類中需要調用的地方實現監聽函數方法
mOnkeyValueListener.getKeyValueClick("點擊了A"); //該方法可以在A類跟Main類中調用,都會將內容傳給Main類。這句話就實現了監聽的效果
三、傳入監聽函數,並實現方法
public class MainActivity extends Activity implements OnKeyValueListener{
MyButton myButton ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myButton = new MyButton(MainActivity.this);
myButton.setmOnkeyValueListener(this); //傳遞監聽對象到A類
myButton.doClick(); //這里是調用A類中的方法,接受到A類傳入的內容
}
@Override
public void getKeyValueClick(String value) {
Log.d("panzq","######## value = "+value); //打印獲取到的內容
}
}
結果
2019-04-17 12:55:38.285 3660-3660/com.panzq.callbacklistener D/panzq: ######## value = 點擊了A
1.為按鈕setmOnkeyValueListener注冊監聽,將括號里面的this作為參數傳給MyButton,this繼承了 OnKeyValueListener
2.由於MyButton中有一個setmOnkeyValueListener方法,通過this.mOnkeyValueListener = mOnkeyValueListener;;可以將第一步傳進來的OnKeyValueListener對象賦給其成員變量
3.用戶點擊屏幕,觸發系統底層的doClick函數
4.在doClick函數中mOnkeyValueListener.getKeyValueClick("點擊了A")中,由第二步我們已知listener已被賦予成用戶傳進來的具體實現,所以此時的 mOnkeyValueListener.getKeyValueClick("點擊了A");所調用的方法就是用戶傳進來的listener中重寫的getKeyValueClick方法,到這里也就是相當於反過來調用回用戶所重寫的getKeyValueClick(),這里的getKeyValueClick也就是我們常說的回調方法。