今天看資料書,重新梳理了一邊Android的基本知識。被導師一陣忽悠,準備把自己整理的分享給大家,同時也為了自己日后方便整理Android的知識框架。基本上自己寫的時候,都會寫上基本的代碼+分析,畢竟所有離開代碼的話都是空話(尬聊 - -!)
注:大家可以把這些當成我的讀書筆記,或者是自己的看法,更或者是我上網收集整合的一些資料,大家一起來點評我的理解是否有錯誤的地方,或者其他不足之處,關于涉及的書籍作者和其他來源,我會在文章的最后寫明。
一、關于監聽機制
最常見的場景應該是下面這段代碼了:
Button button = (Button)findViewById(R.id.xxx);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//response click
}
});
```
或者是:
View.OnClickListener onClickListener = view -> handleClick(); //工作需要,以后都會用lambda表達式寫代碼
findViewById(R.id.xxx).setOnClickListener(onClickListener)
它的機制就是將處理點擊事件的方法委托給別人,具體在哪里和怎樣實現我不管,我就只負責綁定好一個監聽器,由這個監聽器監聽這個事件是否發生,以及發生之后該如何響應。
##二、關于回調機制
如果說監聽機制就是委托式事件處理,事件源和事件處理(監聽)是分開的。那么相反的,回調則是兩者統一,當用戶在觸發事件的時候,由控件自己來解決。但是回調也是有它的限制的,它不像監聽那樣,由我們動態的添加方法(新建一個listener,listener.onCLicker()重寫),它必須由我們繼承GUI組件類,并重寫該類的方法來實現。
本來應該舉handler的,但是既然監聽舉了button,關于回調最好也用button響應。
public class MyButton extends View {
public MyButton { //... }
@override
public boolean onKeyDown(MotionEvent event){
//...response click (because click = keydown )
}
}
---xml---
<packagename.MyButton
android:id = ...
android:layout_width = ...
android:layout_height = ...
</packagename.MyButton>
然后在相應視圖中點擊按鈕,便是MyButton里面的onKeyDown()負責響應。
*注:如果說在MyButton里面添加一個內部類做監聽器,在里面寫下具體的實現,不知道算不算切合“回調”的定義?但是這實際上也是把響應事件的實現交給內部類了,并不是MyButton自己來處理,只不過代碼是寫在里面了,應該不算把。。。。尬聊 ing*
##三、監聽和回調的優先級
本來應該寫一下回調的優先級了,但這并不是這篇文章的主旨,畢竟不是深入去講回調或者講監聽這兩者,而是去指出兩者的區別,但是在例子中也涉及了多重回調之間的優先級。
public class MyButton extends View {
public MyButton { //... }
@override
public boolean onKeyDown(MotionEvent event){
//...response click (because click = keydown )
Log.i("me","MyButtton onKeyDown");
return false; //如果這里return true的話,MainActivity就不會響應它的onKeyDown()事件了
}
}
public class MainActivity extends Activity {
//...
@override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout....);
View.OnClickListener onClickListener = view -> Log.i("me","MainActivity onClickListener");
(MyButton) findViewById(R.id.xxx).setOnClickListener(onClickListener);
}
@override
public boolean onKeyDown(MotionEvent event){
//MainActivity響應onKeyDown事件
Log.i("me","MainActivity onKeyDown");
}
}
---logcat---當點擊button之后
~:MainActivity onClickListener
~:MyButtton onKeyDown
~:MainActivity onKeyDown
上面的例子說明了:
1. 優先級: 監聽 > 回調 。
2. 回調的事件傳播: 監聽事件 -> 該視圖區域最里面的類的回調方法 ->return true 攔截,結束;return false -> 該視圖區域上一層類(存在多個視圖嵌套子類的情況)的回調方法 -> .... 直到return true或者到最外層Activity
--End
*注:大部分代碼資料來源于 李剛的《瘋狂Android講義》(第三版)有刪減*