新聞中心
基于監(jiān)聽的事件模型分工更明確,事件源、事件監(jiān)聽由兩個類分開,因此具有更好的可維護性。
Android的事件處理機制保證基于監(jiān)聽的事件監(jiān)聽器會被優(yōu)先出發(fā)。
在事件監(jiān)聽的處理模型中,主要涉及三類對象:
1.Event Source(事件源):事件發(fā)生的場所,通常就是各個組件,例如按鈕,窗口,菜單等。
2.Event(事件):事件封裝了界面組件上發(fā)生的特定事情(通常就是一次用戶操作)。如果程序需要獲得界面組件上所發(fā)生事情的相關(guān)信息,一般通過Event對象來取得。
3.Event Listener(事件監(jiān)聽器):負(fù)責(zé)監(jiān)聽事件源所發(fā)生的事件,并對各種事件做出相應(yīng)的響應(yīng)。
Android為不同的界面組件提供了不同的監(jiān)聽器接口:
1.View.OnClickListener:單擊事件的事件監(jiān)聽器必須實現(xiàn)的接口。
2.View.OnCreateContextMenuListener:創(chuàng)建上下文菜單事件的事件監(jiān)聽器必須實現(xiàn)的接口。
3.View.onFocusChangeListener:焦點改變事件的事件監(jiān)聽器必須實現(xiàn)的接口。
4.View.OnKeyListener:按鍵事件的事件監(jiān)聽器必須實現(xiàn)的接口。
5.View.OnLongClickListener:長按事件的事件監(jiān)聽器必須實現(xiàn)的接口。
6.View.OnTouchListener:觸摸事件的事件監(jiān)聽器必須實現(xiàn)的接口。
所謂的事件監(jiān)聽器,其實就是實現(xiàn)了特定接口的java類的實例。在程序中實現(xiàn)事件監(jiān)聽器,通常有如下幾種形式。
1.內(nèi)部類形式:將事件監(jiān)聽器類定義成當(dāng)前的內(nèi)部類。
2.外部類形式:將事件監(jiān)聽器類定義成一個外部類。
3.Activity本身作為事件監(jiān)聽器類:讓Activity本身實現(xiàn)監(jiān)聽器接口,并實現(xiàn)事件處理方法。
4.匿名內(nèi)部類形式:使用匿名內(nèi)部類創(chuàng)建事件監(jiān)聽器對象。
5.直接綁定標(biāo)簽:為UI組件的android:onClick屬性指定事件的監(jiān)聽方法,開發(fā)者需要在Activity中定義該事件監(jiān)聽方法(該方法必須有一個View類型的形參,該形參代表被單擊的UI組件),當(dāng)用戶單擊該UI組件時,系統(tǒng)將會激發(fā)android:onClick屬性所指定的方法。
1.內(nèi)部類作為事件監(jiān)聽器類
使用內(nèi)部類作為事件監(jiān)聽器類的優(yōu)勢:
①使用內(nèi)部類可以在當(dāng)前類中復(fù)用該監(jiān)聽器類
②因為監(jiān)聽器類是外部類的內(nèi)部類,所以可以自由訪問外部類的所有界面組件。
示例:
activity_main.xml
MainActivity.java
package com.example.neibulei; public class MainActivity extends Activity { private Button bn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 獲取activity_main界面中的id為bn按鈕 bn = (Button) findViewById(R.id.bn); // 為bn按鈕綁定點擊事件監(jiān)聽器 bn.setOnClickListener(new MyClickListener()); } // 定義一個單擊事件監(jiān)聽器 class MyClickListener implements View.OnClickListener { @Override // 實現(xiàn)監(jiān)聽器類必須實現(xiàn)的方法,該方法將會作為事件處理器 public void onClick(View v) { // TODO Auto-generated method stub //事件處理器做出的響應(yīng) Toast.makeText(MainActivity.this, "內(nèi)部類做為事件監(jiān)聽器類", 1).show(); } } }
2.外部類作為事件監(jiān)聽器類
外部類作為事件監(jiān)聽器類的劣勢:
①事件監(jiān)聽器通常屬于特定的GUI界面,定義成外部類不利于提高程序的內(nèi)聚性。
②外部類形式的事件監(jiān)聽器不能自由訪問GUI界面的類中的組件,變成不夠簡潔。
外部類作為事件監(jiān)聽器類的優(yōu)勢:
如果某個事件監(jiān)聽器確實需要被多個GUI界面所共享,而且主要是完成某種業(yè)務(wù)邏輯的實現(xiàn),則可以考慮使用外部類的形式來定義事件監(jiān)聽器類。
示例:
activity_main.xml
MainActivity.java
package com.example.waibulei; public class MainActivity extends Activity { EditText address; // 短信發(fā)送給這個號碼 EditText content; // 短信內(nèi)容 Button bn; // 發(fā)送按鈕 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 獲取頁面內(nèi)中的收件人地址、短信內(nèi)容 address = (EditText) findViewById(R.id.address); content = (EditText) findViewById(R.id.content); bn = (Button) findViewById(R.id.bn); // 為bn按鈕綁定長按事件監(jiān)聽器 bn.setOnLongClickListener(new SendSmsListener(this, address, content)); } }
SendSmsListener.java
package com.example.waibulei; public class SendSmsListener implements OnLongClickListener { private Activity act; private EditText address;// 短信發(fā)送給這個號碼 private EditText content;// 短信內(nèi)容 // 構(gòu)造方法取得上下文環(huán)境,獲得兩個文本框控件 public SendSmsListener(Activity act, EditText address, EditText content) { this.act = act; this.address = address; this.content = content; } @Override public boolean onLongClick(View v) { // 取出號碼與短信內(nèi)容 String addressStr = address.getText().toString().trim(); String contentStr = content.getText().toString().trim(); // 獲取短信管理器 SmsManager smsManager = SmsManager.getDefault(); // 發(fā)送文本短信 smsManager.sendTextMessage(addressStr, null, contentStr, null, null); return false; } }
在AndroidManifest.xml上添加發(fā)送短信的權(quán)限
3.Activity本身作為事件監(jiān)聽器
Activity本身作為事件監(jiān)聽器的劣勢:
①這種形式可能造成程序結(jié)構(gòu)混亂,Activity的主要職責(zé)應(yīng)該是完成界面初始化工作,但此時還需要包含事件處理器的方法,從而引起混亂。
②如果Activity界面類需要實現(xiàn)監(jiān)聽器接口,讓人感覺比較怪異。
Activity本身作為事件監(jiān)聽器的優(yōu)勢:
直接在Activity類中定義事件處理方法,非常簡潔。
示例:
activity_main.xml
MainActivity.java
package com.example.activitybenshen; //實現(xiàn)事件監(jiān)聽器接口 public class MainActivity extends Activity implements OnClickListener { private Button bn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bn = (Button) findViewById(R.id.bn); // 直接使用Activity作為監(jiān)聽器 bn.setOnClickListener(this); } @Override // 實現(xiàn)事件處理方法 public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "直接使用Activity作為監(jiān)聽器", 1).show(); } }
4.匿名內(nèi)部類作為事件監(jiān)聽器類
匿名內(nèi)部類作為事件監(jiān)聽器類的優(yōu)勢:
大部分時候,事件處理器都沒有什么復(fù)用價值(可復(fù)用代碼通常都被抽象成了業(yè)務(wù)邏輯方法),因此大部分事件監(jiān)聽器只是臨時使用一次,所以使用匿名內(nèi)部類形式的事件監(jiān)聽器更合適。
匿名內(nèi)部類作為事件監(jiān)聽器類的劣勢:
語法不宜掌握。
示例:
activity_main.xml
MainActivity.java
package com.example.nimingneibulei; public class MainActivity extends Activity { private Button bn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bn = (Button) findViewById(R.id.bn); // 使用匿名內(nèi)部類作為事件監(jiān)聽器 bn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 事件監(jiān)聽器的響應(yīng) Toast.makeText(MainActivity.this, "匿名內(nèi)部類作為事件監(jiān)聽器", 1).show(); } }); } }
5.直接綁定到標(biāo)簽
對于很多Android界面組件標(biāo)簽而言,它們都支持OnClick屬性,該屬性值就是一個形如xxx(View source)的方法的方法名。
示例:
activity_main.xml
MainActivity.java
package com.example.onclick; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // 定義一個事件處理方法 // 其中source參數(shù)代表事件源 public void clickHandler(View source) { Toast.makeText(MainActivity.this, "直接綁定到標(biāo)簽onClick", 1).show(); } }
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
分享文章:android(基于監(jiān)聽)的事件處理-創(chuàng)新互聯(lián)
文章起源:http://fisionsoft.com.cn/article/deecdj.html