監聽和回調兩種機制

今天看資料書,重新梳理了一邊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講義》(第三版)有刪減*
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,740評論 25 708
  • 好奇觸摸事件是如何從屏幕轉移到APP內的?困惑于Cell怎么突然不能點擊了?糾結于如何實現這個奇葩響應需求?亦或是...
    Lotheve閱讀 57,742評論 51 602
  • 在iOS開發中經常會涉及到觸摸事件。本想自己總結一下,但是遇到了這篇文章,感覺總結的已經很到位,特此轉載。作者:L...
    WQ_UESTC閱讀 6,072評論 4 26
  • 【新時代是個會因思考力差距而造成極大差距的時代】 最近一段時間,知識付費作為一個新的爆發點,在互聯網上興起,主要原...
    法拉劉閱讀 545評論 0 0
  • 黃色身軀路邊停 撥碼解鎖簡易行 共享經濟順時應 設計漏洞小人盯 國人素質參不齊 破壞涂改放...
    細聽風雨者閱讀 181評論 4 6