標籤:目錄 android事 簡單 價值 存在 tar 聯絡 教程 npe
通過對Android基本組件的學習,也有接觸少部分Android的事件處理,比如按鈕的點擊事件、選框的狀態切換事件。
一、Android事件處理
Android提供了兩種方式的事件處理:基於回調的事件處理和基於監聽的事件處理。
一般來說,基於回調的事件處理可用於處理一些具有通用性的事件,基於回調的事件處理代碼會顯得比較簡潔。但對於某些特定的事件,無法使用基於回調的事件處理,只能採用基於監聽的事件處理。
本期先來學習基於監聽的事件處理,後面再學習基於回調的事件處理,關注分享達人秀(ShareExpert)擷取第一手教程,也可以加小編(jinwenyu2010)拽入Android零基礎入門技術討論群共同進步。
二、基於監聽的事件處理概述
基於監聽的事件處理是一種更“物件導向”的事件處理,在事件監聽的處理模型中主要涉及如下三類對象。
Event Source (事件來源):事件發生的場所,通常就是各個組件,例如按鈕、視窗、菜單等。
Event (事件):事件封裝了介面組件上發生的特定事情(通常就是一次使用者操作)。如果程式需要獲得介面組件上所發生事件的相關資訊,一般通過Event對象來取得。
Event Listener (事件監聽器):負責監聽事件來源所發生的事件,並對各種事件做出相應的響應。
當使用者按下一個按鈕或者單擊某個功能表項目時,這些動作就會激發一個相應的事件,該事件就會觸發事件來源上註冊的事件監聽器(特殊的Java對象),事件監聽器調用對應的事件處理器 (事件監聽器裡的執行個體方法)來做出相應的響應。
每個組件均可以針對特定的事件指定一個事件監聽器,每個事件監聽器也可監聽一個或多個事件來源。因為同一個事件來源上可能發生多種事件,委派式事件處理方式可以把事件來源上所有可能發生的事件分別授權給不同的事件監聽器來處理;同時也可以讓一類事件都使用同一個事件監聽器來處理。
Android事件處理流程如所示:
從可以知道,基於監聽的事件處理模型的流程如下:
為某個事件來源(介面組件)設定一個監聽器,用於監聽使用者操作。
當使用者操作時,會觸發事件來源的監聽器。
產生了對應的事件對象。
將這個事件來源對象作為參數傳給事件監聽器。
事件監聽器對事件對象進行判斷,執行對應的事件處理器(對應事件的處理方法)。
Android中基於監聽的事件處理模型的開發步驟如下。
擷取普通介面組件(事件來源),也就是被監聽的對象。
實現事件監聽器類,該監聽器類是一個特殊的Java類,必須實現一個XxxListener介面。
呼叫事件源的setXxxListener方法將事件監聽器對象註冊給普通組件(事件來源)。
對於這三件事情,事件來源可以是任何介面組件,不太需要開發人員參與;註冊監聽器也只要一行代碼即可,因此事件編程的關鍵就是實現事件監聽器類。
在基於監聽的事件處理模型中,事件監聽器必須實現事件監聽器介面,Android為不同的介面組件提供了不同的監聽器介面,這些介面通常以內部類的形式存在。以View類為例,它包含了如下幾個內部介面。
View.OnClickListener:單擊事件的事件監聽器必須實現的介面。
View.OnCreateContextMenu Listener :建立操作功能表事件的事件監聽器必須實現的介面。
View.onFocusChangeListener:焦點改變事件的事件監聽器必須實現的介面。
View.OnKeyListener:按鍵事件的事件監聽器必須實現的介面。
View.OnLongClickListener:長按事件的事件監聽器必須實現的介面。
View.OnTouchListener:觸摸事件的事件監聽器必須實現的介面。
通過前面的學習,知道事件監聽器就是實現了特定介面的Java類的執行個體。在程式中實現事件監聽器,通常有如下幾種形式。
匿名內部類形式:使用匿名內部類建立事件監聽器對象。
內部類形式:將事件監聽器類定義成當前類的內部類。
外部類形式:將事件監聽器類定義成一個外部類。
Activity本身作為事件監聽器類:讓Activity本身實現監聽器介面,並實現事件處理方法。
直接綁定到標籤形式:直接在xml布局檔案對應的Activity中定義一個事件處理方法,然後在布局檔案中引用要觸發的事件。
三、使用匿名內部類作為事件監聽器
大部分時候,事件處理器都沒有什麼複用價值(可複用代碼通常都被抽象成了商務邏輯方法),因此大部分事件監聽器只是臨時使用一次,所以使用匿名內部類形式的事件監聽器更合適。實際上,這種形式是目前使用最廣泛的事件監聽器形式,在前面的基本組件學習中也是使用的該種方法來綁定監聽器。
接下來通過一個簡單的樣本程式來學習Android使用匿名內部類作為事件監聽器。
同樣使用WidgetSample工程,繼續使用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" > <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="使用匿名內部類監聽事件"/></RelativeLayout>
為了監聽按鈕的點擊事件,在Java代碼中為其添加點擊事件監聽器,具體代碼如下:
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 { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.event_anonymous_inner_class_layout); // 擷取介面組件 Button button = (Button) findViewById(R.id.button); // 使用匿名內部類的執行個體作為事件監聽器 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 實現事件處理 Toast.makeText(MainActivity.this, "收到點擊事件", Toast.LENGTH_SHORT).show(); } }); }}
上面程式中的粗體字部分使用匿名內部類建立了一個事件監聽器對象,“new監聽器介面”或“new事件適配器”的形式就是用於建立匿名內部類形式的事件監聽器。
運行程式,點擊按鈕,可以看到所示介面效果。
對於使用匿名內部類作為事件監聽器類的形式來說,唯一的缺點就是匿名內部類的文法有點不易掌握,如果Java基礎紮實,匿名內部類的文法掌握較好,通常建議使用匿名內部類作為監聽器類。
Android中基於監聽的事件處理的其他四種形式下期再繼續學習。
今天就先到這裡,如果有問題歡迎留言一起探討,也歡迎加入Android零基礎入門技術討論群,共同成長!
此文章著作權為公眾號分享達人秀(ShareExpert)——鑫鱻所有,若需轉載請聯絡作者授權,特此聲明!
往期總結分享:
Android零基礎入門第1節:Android的前世今生
Android零基礎入門第2節:Android 系統架構和應用組件那些事
Android零基礎入門第3節:帶你一起來聊一聊Android開發環境
Android零基礎入門第4節:正確安裝和配置JDK, 高富帥養成第一招
Android零基礎入門第5節:善用ADT Bundle, 輕鬆邂逅女神
Android零基礎入門第6節:配置最佳化SDK Manager, 正式約會女神
Android零基礎入門第7節:搞定Android模擬器,開啟甜蜜之旅
Android零基礎入門第8節:HelloWorld,我的第一趟旅程出發點
Android零基礎入門第9節:Android應用實戰,不懂代碼也可以開發
Android零基礎入門第10節:開發IDE大升級,終於迎來了Android Studio
Android零基礎入門第11節:簡單幾步帶你飛,運行Android Studio工程
Android零基礎入門第12節:熟悉Android Studio介面,開始裝逼賣萌
Android零基礎入門第13節:Android Studio配置最佳化,打造開發利器
Android零基礎入門第14節:使用高速Genymotion,跨入火箭時代
Android零基礎入門第15節:掌握Android Studio項目結構,揚帆起航
Android零基礎入門第16節:Android使用者介面開發概述
Android零基礎入門第17節:TextView屬性和方法大全
Android零基礎入門第18節:EditText的屬性和使用方法
Android零基礎入門第19節:Button使用詳解
Android零基礎入門第20節:CheckBox和RadioButton使用大全
Android零基礎入門第21節:ToggleButton和Switch使用大全
Android零基礎入門第22節:ImageView的屬性和方法大全
Android零基礎入門第23節:ImageButton和ZoomButton使用大全
Android零基礎入門第24節:自訂View簡單使用,打造屬於你的控制項
Android零基礎入門第25節:簡單且最常用的LinearLayout線性布局
Android零基礎入門第26節:兩種對齊,layout_gravity和gravity大不同
Android零基礎入門第27節:正確使用padding和margin
Android零基礎入門第28節:輕鬆掌握RelativeLayout相對布局
Android零基礎入門第29節:善用TableLayout表格版面配置
Android零基礎入門第30節:兩分鐘掌握FrameLayout幀布局
Android零基礎入門第31節:少用的AbsoluteLayout絕對布局
Android零基礎入門第32節:新推出的GridLayout網格布局
Android零基礎入門第33節:Android事件處理概述