版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】android(基于監(jiān)聽)的事件處理
基于監(jiān)聽的事件模型分工更明確,事件源、事件監(jiān)聽由兩個類分開,因此具有更好的可維護(hù)性。
Android的事件處理機(jī)制保證基于監(jiān)聽的事件監(jiān)聽器會被優(yōu)先出發(fā)。
在事件監(jiān)聽的處理模型中,主要涉及三類對象:
1.EventSource(事件源):事件發(fā)生的場所,通常就是各個組件,例如按鈕,窗口,菜單等。
2.Event(事件):事件封裝了界面組件上發(fā)生的特定事情(通常就是一次用戶操作)。如果程序需要獲得界面組件上所發(fā)生事情的相關(guān)信息,一般通過Event對象來取得。
3.EventListener(事件監(jiān)聽器):負(fù)責(zé)監(jiān)聽事件源所發(fā)生的事件,并對各種事件做出相應(yīng)的響應(yīng)。
Android為不同的界面組件提供了不同的監(jiān)聽器接口:
1.View.OnClickListener:單擊事件的事件監(jiān)聽器必須實(shí)現(xiàn)的接口。
2.View.OnCreateContextMenuListener:創(chuàng)建上下文菜單事件的事件監(jiān)聽器必須實(shí)現(xiàn)的接口。
3.View.onFocusChangeListener:焦點(diǎn)改變事件的事件監(jiān)聽器必須實(shí)現(xiàn)的接口。
4.View.OnKeyListener:按鍵事件的事件監(jiān)聽器必須實(shí)現(xiàn)的接口。
5.View.OnLongClickListener:長按事件的事件監(jiān)聽器必須實(shí)現(xiàn)的接口。
6.View.OnTouchListener:觸摸事件的事件監(jiān)聽器必須實(shí)現(xiàn)的接口。
所謂的事件監(jiān)聽器,其實(shí)就是實(shí)現(xiàn)了特定接口的java類的實(shí)例。在程序中實(shí)現(xiàn)事件監(jiān)聽器,通常有如下幾種形式。
1.內(nèi)部類形式:將事件監(jiān)聽器類定義成當(dāng)前的內(nèi)部類。
2.外部類形式:將事件監(jiān)聽器類定義成一個外部類。
3.Activity本身作為事件監(jiān)聽器類:讓Activity本身實(shí)現(xiàn)監(jiān)聽器接口,并實(shí)現(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)聽器類
②因?yàn)楸O(jiān)聽器類是外部類的內(nèi)部類,所以可以自由訪問外部類的所有界面組件。示例:activity_main.xml
<LinearLayout
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/bn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="內(nèi)部類做為事件監(jiān)聽器類"
/>
</LinearLayout>MainActivity.javapackage
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按鈕綁定點(diǎn)擊事件監(jiān)聽器
bn.setOnClickListener(new
MyClickListener());
}
//
定義一個單擊事件監(jiān)聽器
class
MyClickListener
implements
View.OnClickListener
{
@Override
//
實(shí)現(xiàn)監(jiān)聽器類必須實(shí)現(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)聽器確實(shí)需要被多個GUI界面所共享,而且主要是完成某種業(yè)務(wù)邏輯的實(shí)現(xiàn),則可以考慮使用外部類的形式來定義事件監(jiān)聽器類。示例:activity_main.xml
<LinearLayout
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<EditText
android:id="@+id/address"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<EditText
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/bn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="外部類作為事件監(jiān)聽器類(發(fā)送短信)"
/>
</LinearLayout>MainActivity.javapackage
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.javapackage
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)限<uses-permission
android:name="android.permission.SEND_SMS"
/>
3.Activity本身作為事件監(jiān)聽器
Activity本身作為事件監(jiān)聽器的劣勢:
①這種形式可能造成程序結(jié)構(gòu)混亂,Activity的主要職責(zé)應(yīng)該是完成界面初始化工作,但此時還需要包含事件處理器的方法,從而引起混亂。
②如果Activity界面類需要實(shí)現(xiàn)監(jiān)聽器接口,讓人感覺比較怪異。
Activity本身作為事件監(jiān)聽器的優(yōu)勢:
直接在Activity類中定義事件處理方法,非常簡潔。示例:activity_main.xml
<LinearLayout
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/bn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Activity本身作為事件監(jiān)聽器"
/>
</LinearLayout>MainActivity.javapackage
com.example.activitybenshen;
//實(shí)現(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
//
實(shí)現(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ù)用價(jià)值(可復(fù)用代碼通常都被抽象成了業(yè)務(wù)邏輯方法),因此大部分事件監(jiān)聽器只是臨時使用一次,所以使用匿名內(nèi)部類形式的事件監(jiān)聽器更合適。
匿名內(nèi)部類作為事件監(jiān)聽器類的劣勢:
語法不宜掌握。示例:activity_main.xml<LinearLayout
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/bn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="匿名內(nèi)部類作為事件監(jiān)聽器類"
/>
</LinearLayout>MainActivity.javapackage
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(Viewsource)的方法的方法名。示例:activity_main.xml<LinearLayout
xmlns
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026中國農(nóng)業(yè)科學(xué)院第一批統(tǒng)一招聘359人備考題庫及完整答案詳解1套
- 2025四川成都東部新區(qū)(考核)招聘高層次教育人才5人備考題庫附答案詳解
- 2026四川雅安市漢源縣兵役登記備考題庫附答案詳解
- 2026北京海納川技術(shù)中心實(shí)習(xí)生招聘備考題庫及參考答案詳解
- 農(nóng)業(yè)生產(chǎn)柴油管理制度
- 生產(chǎn)消防制度
- 石料生產(chǎn)室管理制度
- 維修工程安全生產(chǎn)制度
- 教練安全生產(chǎn)獎懲制度
- 生產(chǎn)部勞保發(fā)放制度
- 化工廠班組安全培訓(xùn)課件
- 2025四川成都農(nóng)商銀行招聘10人筆試備考題庫及答案解析
- 營業(yè)執(zhí)照借用協(xié)議合同
- 2025年秋蘇教版(新教材)初中生物八年級上冊期末知識點(diǎn)復(fù)習(xí)卷及答案(共三套)
- 2025年小升初學(xué)校家長面試題庫及答案
- 2025年法考客觀題真題回憶版(含答案)
- 2025年?;沸孤?yīng)急培訓(xùn)教案
- 2026年鐵嶺衛(wèi)生職業(yè)學(xué)院單招職業(yè)技能測試題庫附答案詳解
- 2025年江南大學(xué)招聘真題(行政管理崗)
- 2024-2025學(xué)年江蘇省南通市海門區(qū)高二上學(xué)期期末調(diào)研地理試題(解析版)
- 汽車焊接知識培訓(xùn)
評論
0/150
提交評論