編輯:Android開發實例
Android提供了強大的事件處理機制,包括兩套事件處理機制:
一、基於監聽的事件處理
在事件監聽的處理模型中,主要涉及如下三類對象:
Android的事件處理機制是一種委派式事件處理方式:普通組件(事件源)將整個事件處理委托給特定的對象(事件監聽器);當該事件源發生指定的事件時,就通知所委托的事件監聽器,由事件監聽器來處理這個事件。
所謂事件監聽器,其實就是實現了特定接口的Java類的實力。在程序中實現事件監聽器,通常有如下幾種形式:
1、外部類形式
使用頂級類定義事件監聽器類的形式比較少見,所以不推薦使用,主要因為如下兩個原因:
使用步驟:
示例:
事件處理類,監聽了OnLongClick事件。
- public class SendSmsListener implements OnLongClickListener {
- private Activity act;
- public SendSmsListener(Activity act)
- {
- this.act=act;
- }
- public boolean onLongClick(View arg0) {
- // 事件處理邏輯
- return false;
- }
- }
調用:
- public class Main extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button btn=(Button)this.findViewById(R.id.button1);
- btn.setOnLongClickListener(new SendSmsListener(this));
- }
- }
2、Activity本身作為事件監聽器類
這種形式使用Activity本身作為監聽器類,可以直接在Activity類中定義事件處理方法,這種形式非常簡潔。但是這種形式可能造成程序結構混亂,因為Activity的主要職責是完成界面初始化工作。
示例 :
- public class Main extends Activity implements OnClickListener{
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button btn=(Button)this.findViewById(R.id.button1);
- btn.setOnClickListener(this);//綁定Activity的OnClick事件
- }
- public void onClick(View v) {
- // 事件處理邏輯
- }
- }
3、直接綁定到XML標簽中
在Android中,可以直接把事件處理綁定到XML標簽中。
示例:
- <Button
- android:id="@+id/button1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Button"
- android:onClick="btnClick"/>
處理事件:
- public class Main extends Activity{
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- public void btnClick(View v) {
- // 事件處理邏輯
- }
- }
4、匿名內部類作為事件監聽器
因為大部分時候,事件處理器都是沒有復用價值的,因此大部分事件監聽器只是臨時使用一次,所以使用匿名內部類形式的事件監聽器更合適。這也是最廣泛的用法。
示例:
- public class Main extends Activity{
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button btn=(Button)this.findViewById(R.id.button1);
- btn.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- // 事件處理邏輯
- }
- });
- }
- }
二、基於回調的事件處理
對於基於回調的事件處理模型來說,事件源與事件監聽器是統一的,或者說事件監聽器完全消失了。當用戶在GUI組件上激發某個事件時,組件自己特定的方法將會負責處理該事件。此處理方法一般會有一個boolean類型的返回值,該返回值用於標識該處理方法是否能完全處理該事件。如果返回true,表明該處理方法已完全處理該事件,該事件不會傳播出去。如果返回false,表明該處理方法並未完全處理該事件,該事件會傳播出去。
基於回調的事件處理方式主要用於重寫新的組件,繼承原組件的類,然後對其事件進行重寫。在布局的時候,直接使用重寫好的新組件。此時如果觸發事件,則由新組件執行處理。(此方式一般不常用)
示例:
- public class Mybutton extends Button {
- public Mybutton(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- super.onKeyDown(keyCode, event);
- //事件處理邏輯
- return true;//表示該事件不會像外擴散
- }
- }
總結:對於基於監聽的事件處理模型來說,事件源和事件監聽器是分離的,當事件源上發生特定事件之後,該事件交給事件監聽器負責處理;對於基於回調的事件處理模型來說,事件源和事件監聽器是統一的,當事件源發生特定事件之後,該事件還是由事件源本身負責處理。
本文實例講述了Android實現獲取SD卡總容量,可用大小,機身內存總容量及可用大小的方法。分享給大家供大家參考,具體如下: 可能有的同學不知道系統已經提供了獲取
Android中TextView實現的多個可點擊的文本效果
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩