Android零基础入门第33节:Android事件处理概述
? ?通過對Android基本組件的學(xué)習(xí),也有接觸少部分Android的事件處理,比如按鈕的點(diǎn)擊事件、選框的狀態(tài)切換事件。
?
?
一、Android事件處理
?
????Android提供了兩種方式的事件處理:基于回調(diào)的事件處理和基于監(jiān)聽的事件處理。
-
基于監(jiān)聽的事件處理:主要做法就是為Android界面組件綁定特定的事件監(jiān)聽器,前面小節(jié)已經(jīng)見到大量這種事件處理的示例。
-
基于回調(diào)的事件處理:主要做法就是重寫Android組件特定的回調(diào)方法, 或者重寫Activity的回調(diào)方法。Android為絕大部分界面組件都提供了事件響應(yīng)的回調(diào)方法,開發(fā)者只要重寫它們即可。
?
????一般來說,基于回調(diào)的事件處理可用于處理一些具有通用性的事件,基于回調(diào)的事件處理代碼會顯得比較簡潔。但對于某些特定的事件,無法使用基于回調(diào)的事件處理,只能采用基于監(jiān)聽的事件處理。
????本期先來學(xué)習(xí)基于監(jiān)聽的事件處理,后面再學(xué)習(xí)基于回調(diào)的事件處理,關(guān)注分享達(dá)人秀(ShareExpert)獲取第一手教程,也可以加小編微信(jinwenyu2010)拽入Android零基礎(chǔ)入門技術(shù)討論微信群共同進(jìn)步。
?
?
二、基于監(jiān)聽的事件處理概述
?
????基于監(jiān)聽的事件處理是一種更“面向?qū)ο蟆钡氖录幚?#xff0c;在事件監(jiān)聽的處理模型中主要涉及如下三類對象。
-
Event Source (事件源):事件發(fā)生的場所,通常就是各個(gè)組件,例如按鈕、窗口、菜單等。
-
Event (事件):事件封裝了界面組件上發(fā)生的特定事情(通常就是一次用戶操作)。如果程序需要獲得界面組件上所發(fā)生事件的相關(guān)信息,一般通過Event對象來取得。
-
Event Listener (事件監(jiān)聽器):負(fù)責(zé)監(jiān)聽事件源所發(fā)生的事件,并對各種事件做出相應(yīng)的響應(yīng)。
????當(dāng)用戶按下一個(gè)按鈕或者單擊某個(gè)菜單項(xiàng)時(shí),這些動作就會激發(fā)一個(gè)相應(yīng)的事件,該事件就會觸發(fā)事件源上注冊的事件監(jiān)聽器(特殊的Java對象),事件監(jiān)聽器調(diào)用對應(yīng)的事件處理器 (事件監(jiān)聽器里的實(shí)例方法)來做出相應(yīng)的響應(yīng)。
????每個(gè)組件均可以針對特定的事件指定一個(gè)事件監(jiān)聽器,每個(gè)事件監(jiān)聽器也可監(jiān)聽一個(gè)或多個(gè)事件源。因?yàn)橥粋€(gè)事件源上可能發(fā)生多種事件,委派式事件處理方式可以把事件源上所有可能發(fā)生的事件分別授權(quán)給不同的事件監(jiān)聽器來處理;同時(shí)也可以讓一類事件都使用同一個(gè)事件監(jiān)聽器來處理。
????Android事件處理流程如下圖所示:
????從上圖可以知道,基于監(jiān)聽的事件處理模型的流程如下:
為某個(gè)事件源(界面組件)設(shè)置一個(gè)監(jiān)聽器,用于監(jiān)聽用戶操作。
當(dāng)用戶操作時(shí),會觸發(fā)事件源的監(jiān)聽器。
生成了對應(yīng)的事件對象。
將這個(gè)事件源對象作為參數(shù)傳給事件監(jiān)聽器。
事件監(jiān)聽器對事件對象進(jìn)行判斷,執(zhí)行對應(yīng)的事件處理器(對應(yīng)事件的處理方法)。
?
????Android中基于監(jiān)聽的事件處理模型的開發(fā)步驟如下。
獲取普通界面組件(事件源),也就是被監(jiān)聽的對象。
實(shí)現(xiàn)事件監(jiān)聽器類,該監(jiān)聽器類是一個(gè)特殊的Java類,必須實(shí)現(xiàn)一個(gè)XxxListener接口。
調(diào)用事件源的setXxxListener方法將事件監(jiān)聽器對象注冊給普通組件(事件源)。
????對于這三件事情,事件源可以是任何界面組件,不太需要開發(fā)者參與;注冊監(jiān)聽器也只要一行代碼即可,因此事件編程的關(guān)鍵就是實(shí)現(xiàn)事件監(jiān)聽器類。
?
????在基于監(jiān)聽的事件處理模型中,事件監(jiān)聽器必須實(shí)現(xiàn)事件監(jiān)聽器接口,Android為不同的界面組件提供了不同的監(jiān)聽器接口,這些接口通常以內(nèi)部類的形式存在。以View類為例,它包含了如下幾個(gè)內(nèi)部接口。
-
View.OnClickListener:單擊事件的事件監(jiān)聽器必須實(shí)現(xiàn)的接口。
-
View.OnCreateContextMenu Listener :創(chuàng)建上下文菜單事件的事件監(jiān)聽器必須實(shí)現(xiàn)的接口。
-
View.onFocusChangeListener:焦點(diǎn)改變事件的事件監(jiān)聽器必須實(shí)現(xiàn)的接口。
-
View.OnKeyListener:按鍵事件的事件監(jiān)聽器必須實(shí)現(xiàn)的接口。
-
View.OnLongClickListener:長按事件的事件監(jiān)聽器必須實(shí)現(xiàn)的接口。
-
View.OnTouchListener:觸摸事件的事件監(jiān)聽器必須實(shí)現(xiàn)的接口。
?
? ? 通過前面的學(xué)習(xí),知道事件監(jiān)聽器就是實(shí)現(xiàn)了特定接口的Java類的實(shí)例。在程序中實(shí)現(xiàn)事件監(jiān)聽器,通常有如下幾種形式。
匿名內(nèi)部類形式:使用匿名內(nèi)部類創(chuàng)建事件監(jiān)聽器對象。
內(nèi)部類形式:將事件監(jiān)聽器類定義成當(dāng)前類的內(nèi)部類。
外部類形式:將事件監(jiān)聽器類定義成一個(gè)外部類。
Activity本身作為事件監(jiān)聽器類:讓Activity本身實(shí)現(xiàn)監(jiān)聽器接口,并實(shí)現(xiàn)事件處理方法。
直接綁定到標(biāo)簽形式:直接在xml布局文件對應(yīng)的Activity中定義一個(gè)事件處理方法,然后在布局文件中引用要觸發(fā)的事件。
?
?
三、使用匿名內(nèi)部類作為事件監(jiān)聽器
?
????大部分時(shí)候,事件處理器都沒有什么復(fù)用價(jià)值(可復(fù)用代碼通常都被抽象成了業(yè)務(wù)邏輯方法),因此大部分事件監(jiān)聽器只是臨時(shí)使用一次,所以使用匿名內(nèi)部類形式的事件監(jiān)聽器更合適。實(shí)際上,這種形式是目前使用最廣泛的事件監(jiān)聽器形式,在前面的基本組件學(xué)習(xí)中也是使用的該種方法來綁定監(jiān)聽器。
????接下來通過一個(gè)簡單的示例程序來學(xué)習(xí)Android使用匿名內(nèi)部類作為事件監(jiān)聽器。
????同樣使用WidgetSample工程,繼續(xù)使用app/main/res/layout/目錄下的activity_main.xml文件,在其中填充如下代碼片段:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="使用匿名內(nèi)部類監(jiān)聽事件"/> </RelativeLayout>? ? 為了監(jiān)聽按鈕的點(diǎn)擊事件,在Java代碼中為其添加點(diǎn)擊事件監(jiān)聽器,具體代碼如下:
package com.jinyu.cqkxzsxy.android.widgetsample;import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.Toast;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.event_anonymous_inner_class_layout);// 獲取界面組件Button button = (Button) findViewById(R.id.button);// 使用匿名內(nèi)部類的實(shí)例作為事件監(jiān)聽器button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {// 實(shí)現(xiàn)事件處理Toast.makeText(MainActivity.this, "收到點(diǎn)擊事件", Toast.LENGTH_SHORT).show();}});} }? ? 上面程序中的粗體字部分使用匿名內(nèi)部類創(chuàng)建了一個(gè)事件監(jiān)聽器對象,“new監(jiān)聽器接口”或“new事件適配器”的形式就是用于創(chuàng)建匿名內(nèi)部類形式的事件監(jiān)聽器。
????運(yùn)行程序,點(diǎn)擊按鈕,可以看到下圖所示界面效果。
????對于使用匿名內(nèi)部類作為事件監(jiān)聽器類的形式來說,唯一的缺點(diǎn)就是匿名內(nèi)部類的語法有點(diǎn)不易掌握,如果Java基礎(chǔ)扎實(shí),匿名內(nèi)部類的語法掌握較好,通常建議使用匿名內(nèi)部類作為監(jiān)聽器類。
????Android中基于監(jiān)聽的事件處理的其他四種形式下期再繼續(xù)學(xué)習(xí)。
?
? ? 今天就先到這里,如果有問題歡迎留言一起探討,也歡迎加入Android零基礎(chǔ)入門技術(shù)討論微信群,共同成長!
? ?此文章版權(quán)為微信公眾號分享達(dá)人秀(ShareExpert)——鑫鱻所有,若需轉(zhuǎn)載請聯(lián)系作者授權(quán),特此聲明!
?
?
往期總結(jié)分享:
Android零基礎(chǔ)入門第1節(jié):Android的前世今生
Android零基礎(chǔ)入門第2節(jié):Android 系統(tǒng)架構(gòu)和應(yīng)用組件那些事
Android零基礎(chǔ)入門第3節(jié):帶你一起來聊一聊Android開發(fā)環(huán)境
Android零基礎(chǔ)入門第4節(jié):正確安裝和配置JDK, 高富帥養(yǎng)成第一招
Android零基礎(chǔ)入門第5節(jié):善用ADT Bundle, 輕松邂逅女神
Android零基礎(chǔ)入門第6節(jié):配置優(yōu)化SDK Manager, 正式約會女神
Android零基礎(chǔ)入門第7節(jié):搞定Android模擬器,開啟甜蜜之旅
Android零基礎(chǔ)入門第8節(jié):HelloWorld,我的第一趟旅程出發(fā)點(diǎn)
Android零基礎(chǔ)入門第9節(jié):Android應(yīng)用實(shí)戰(zhàn),不懂代碼也可以開發(fā)
Android零基礎(chǔ)入門第10節(jié):開發(fā)IDE大升級,終于迎來了Android Studio
Android零基礎(chǔ)入門第11節(jié):簡單幾步帶你飛,運(yùn)行Android Studio工程
Android零基礎(chǔ)入門第12節(jié):熟悉Android Studio界面,開始裝逼賣萌
Android零基礎(chǔ)入門第13節(jié):Android Studio配置優(yōu)化,打造開發(fā)利器
Android零基礎(chǔ)入門第14節(jié):使用高速Genymotion,跨入火箭時(shí)代
Android零基礎(chǔ)入門第15節(jié):掌握Android Studio項(xiàng)目結(jié)構(gòu),揚(yáng)帆起航
Android零基礎(chǔ)入門第16節(jié):Android用戶界面開發(fā)概述
Android零基礎(chǔ)入門第17節(jié):TextView屬性和方法大全
Android零基礎(chǔ)入門第18節(jié):EditText的屬性和使用方法
Android零基礎(chǔ)入門第19節(jié):Button使用詳解
Android零基礎(chǔ)入門第20節(jié):CheckBox和RadioButton使用大全
Android零基礎(chǔ)入門第21節(jié):ToggleButton和Switch使用大全
Android零基礎(chǔ)入門第22節(jié):ImageView的屬性和方法大全
Android零基礎(chǔ)入門第23節(jié):ImageButton和ZoomButton使用大全
Android零基礎(chǔ)入門第24節(jié):自定義View簡單使用,打造屬于你的控件
Android零基礎(chǔ)入門第25節(jié):簡單且最常用的LinearLayout線性布局
Android零基礎(chǔ)入門第26節(jié):兩種對齊方式,layout_gravity和gravity大不同
Android零基礎(chǔ)入門第27節(jié):正確使用padding和margin
Android零基礎(chǔ)入門第28節(jié):輕松掌握RelativeLayout相對布局
Android零基礎(chǔ)入門第29節(jié):善用TableLayout表格布局
Android零基礎(chǔ)入門第30節(jié):兩分鐘掌握FrameLayout幀布局
Android零基礎(chǔ)入門第31節(jié):少用的AbsoluteLayout絕對布局
Android零基礎(chǔ)入門第32節(jié):新推出的GridLayout網(wǎng)格布局
總結(jié)
以上是生活随笔為你收集整理的Android零基础入门第33节:Android事件处理概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [SQL] 函数整理(T-SQL 版)
- 下一篇: Android笔记:onSaveInst