【移動應(yīng)用開發(fā)技術(shù)】android(基于監(jiān)聽)的事件處理_第1頁
【移動應(yīng)用開發(fā)技術(shù)】android(基于監(jiān)聽)的事件處理_第2頁
【移動應(yīng)用開發(fā)技術(shù)】android(基于監(jiān)聽)的事件處理_第3頁
【移動應(yīng)用開發(fā)技術(shù)】android(基于監(jiān)聽)的事件處理_第4頁
【移動應(yīng)用開發(fā)技術(shù)】android(基于監(jiān)聽)的事件處理_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論