日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android基于监听的事件处理机制

發(fā)布時(shí)間:2025/3/20 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android基于监听的事件处理机制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Android提供了強(qiáng)大的事件處理機(jī)制,主要包括兩大類(lèi):

1,基于監(jiān)聽(tīng)的事件處理機(jī)制:主要做法是為Android界面組件綁定特定的事件監(jiān)聽(tīng)器

2,基于回調(diào)的事件處理機(jī)制:主要做法是重寫(xiě)Android組件特定的回調(diào)方法,或重寫(xiě)Activity的回調(diào)方法。也就是說(shuō)Android的絕大多數(shù)的界面組件都提供了事件響應(yīng)的回調(diào)方法,開(kāi)發(fā)者只要重寫(xiě)它們即可


基于監(jiān)聽(tīng)的事件處理是一種更加面向?qū)ο蟮氖录幚?#xff0c;這種事件處理方式與Java的Swing處理方式幾乎相同。

監(jiān)聽(tīng)處理模型:

事件源(Event Source):事件發(fā)生的場(chǎng)所,就是各個(gè)組件,比如按鈕,窗口,菜單等

事件(Event):事件封裝了界面組件上發(fā)生的特定事情(就是用戶(hù)操作)。如果程序需要獲得界面組件上所發(fā)生事件的相關(guān)信息,一般通過(guò)Event對(duì)象來(lái)獲取

事件監(jiān)聽(tīng)器(Event Listener):負(fù)責(zé)監(jiān)聽(tīng)事件源所發(fā)生的時(shí)間,并且對(duì)各個(gè)事件作出響應(yīng)。

委派式事件處理方法:

? 普通組件(事件源)將整個(gè)事件處理委派給特定的對(duì)象(事件監(jiān)聽(tīng)器);當(dāng)該事件源發(fā)生指定的時(shí)間是,就通知所委派的事件監(jiān)聽(tīng)器來(lái)處理這個(gè)事件。

每個(gè)組件都可以針對(duì)特定的時(shí)間指定一個(gè)事件監(jiān)聽(tīng)器,每個(gè)事件監(jiān)聽(tīng)器也可以監(jiān)聽(tīng)一個(gè)或多個(gè)事件源。因?yàn)橥粋€(gè)事件源上可能發(fā)生多個(gè)事件,委派式事件處理方式可以吧事件源上所有可能發(fā)生的時(shí)間分別授權(quán)給不同的事件處理器來(lái)處理;同時(shí)也可以讓一類(lèi)事件都使用同一個(gè)事件監(jiān)聽(tīng)器來(lái)處理。


activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center_horizontal"> <EditText android:id="@+id/txt"android:layout_width="fill_parent" android:layout_height="wrap_content" android:editable="false"android:cursorVisible="false"android:textSize="12pt"/> <!-- 定義一個(gè)按鈕,該按鈕將作為事件源 --> <Button android:id="@+id/bn"android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="單擊我"/> </LinearLayout> MainActivity.java

public class <span style="font-size:24px;">MainActivity </span>extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 獲取應(yīng)用程序中的bn按鈕Button bn = (Button) findViewById(R.id.bn);// 為按鈕綁定事件監(jiān)聽(tīng)器。bn.setOnClickListener(new MyClickListener()); // ①}// 定義一個(gè)單擊事件的監(jiān)聽(tīng)器class MyClickListener implements View.OnClickListener{// 實(shí)現(xiàn)監(jiān)聽(tīng)器類(lèi)必須實(shí)現(xiàn)的方法,該方法將會(huì)作為事件處理器@Overridepublic void onClick(View v){EditText txt = (EditText) findViewById(R.id.txt);txt.setText("bn按鈕被單擊了!");}} } 基于監(jiān)聽(tīng)器的事件處理模型的編程步驟如下:

1,獲取普通界面組件(事件源),也就是被監(jiān)聽(tīng)的對(duì)象

2,實(shí)現(xiàn)時(shí)間監(jiān)聽(tīng)類(lèi),該監(jiān)聽(tīng)器類(lèi)是一個(gè)特殊的Java類(lèi),必須實(shí)現(xiàn)一個(gè)XxxListener接口

3,調(diào)用事件源的setXXXListener方法,將事件監(jiān)聽(tīng)器對(duì)象注冊(cè)給普通組件(事件源)


事件監(jiān)聽(tīng)器必須實(shí)現(xiàn)事件監(jiān)聽(tīng)接口,Android的不同界面組件提供了不同的監(jiān)聽(tīng)器接口,這些接口通常以?xún)?nèi)部類(lèi)的形式存在。以View類(lèi)為例,包含如下監(jiān)聽(tīng)接口:

? ?View.OnClickListener單擊事件的事件監(jiān)聽(tīng)器必須時(shí)間的接口

? ?View.OnCreateContextMenuListener:創(chuàng)建上下文菜單時(shí)間的事件監(jiān)聽(tīng)器必須實(shí)現(xiàn)的接口

? ?View.onFocusChangeListener:焦點(diǎn)改變事件的事件監(jiān)聽(tīng)器必須實(shí)現(xiàn)的接口

? ?View.OnKeyListener:按鍵事件的時(shí)間監(jiān)聽(tīng)器必須實(shí)現(xiàn)的接口

所謂事件監(jiān)聽(tīng)器,其實(shí)就是實(shí)現(xiàn)了特定接口的java類(lèi)的實(shí)例。在程序上一般有幾種形式:

1,內(nèi)部類(lèi)形式:將事件監(jiān)聽(tīng)器定義成當(dāng)前類(lèi)的內(nèi)部類(lèi)

public class EventQs extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 獲取應(yīng)用程序中的bn按鈕Button bn = (Button) findViewById(R.id.bn);// 為按鈕綁定事件監(jiān)聽(tīng)器。bn.setOnClickListener(new MyClickListener()); // }// 定義一個(gè)單擊事件的監(jiān)聽(tīng)器,內(nèi)部類(lèi)形式class MyClickListener implements View.OnClickListener{// 實(shí)現(xiàn)監(jiān)聽(tīng)器類(lèi)必須實(shí)現(xiàn)的方法,該方法將會(huì)作為事件處理器@Overridepublic void onClick(View v){EditText txt = (EditText) findViewById(R.id.txt);txt.setText("bn按鈕被單擊了!");}} } 因?yàn)楸O(jiān)聽(tīng)器是內(nèi)部類(lèi),所以可以自由訪(fǎng)問(wèn)外部類(lèi)的所有界面組件,這也是內(nèi)部類(lèi)的優(yōu)勢(shì)。

2,外部類(lèi)形式:將事件監(jiān)聽(tīng)器類(lèi)定義成一個(gè)外部類(lèi)

外部類(lèi)形式的事件監(jiān)聽(tīng)器不能自由訪(fǎng)問(wèn)創(chuàng)建GUI界面類(lèi)的組件,使用時(shí)需要向監(jiān)聽(tīng)器類(lèi)傳遞GUI界面類(lèi)的組件的引用 ,所以用的比較少

MainActivity.java

public class MainActivity extends Activity {EditText address;EditText content;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 獲取頁(yè)面中收件人地址、短信內(nèi)容address = (EditText)findViewById(R.id.address);content = (EditText)findViewById(R.id.content);Button bn = (Button)findViewById(R.id.send);bn.setOnLongClickListener(new SendSmsListener(this , address, content));//外部類(lèi)形式,需要傳遞本類(lèi)組件} }SendSmsListener.java

public class SendSmsListener implements OnLongClickListener {private Activity act;private EditText address;private EditText content;public SendSmsListener(Activity act, EditText address, EditText content){this.act = act;this.address = address;this.content = content;}@Overridepublic boolean onLongClick(View source){String addressStr = address.getText().toString();String contentStr = content.getText().toString();// 獲取短信管理器SmsManager smsManager = SmsManager.getDefault();// 創(chuàng)建發(fā)送短信的PendingIntentPendingIntent sentIntent = PendingIntent.getBroadcast(act, 0, new Intent(), 0);// 發(fā)送文本短信smsManager.sendTextMessage(addressStr, null, contentStr, sentIntent, null);Toast.makeText(act, "短信發(fā)送完成", Toast.LENGTH_LONG).show();return false;} }

3,Activity本身作為事件監(jiān)聽(tīng)器類(lèi):讓Activity本身實(shí)現(xiàn)監(jiān)聽(tīng)接口,并實(shí)現(xiàn)事件處理器方法

// <span style="font-size:24px;">Activity</span>實(shí)現(xiàn)事件監(jiān)聽(tīng)器接口 public class ActivityListener extends Activityimplements OnClickListener {EditText show;Button bn;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);show = (EditText) findViewById(R.id.show);bn = (Button) findViewById(R.id.bn);// 直接使用Activity作為事件監(jiān)聽(tīng)器bn.setOnClickListener(this);}// 實(shí)現(xiàn)事件處理方法@Overridepublic void onClick(View v){show.setText("bn按鈕被單擊了!");} }

4,匿名內(nèi)部類(lèi)形式:使用匿名內(nèi)部類(lèi)創(chuàng)建事件監(jiān)聽(tīng)器對(duì)象。代碼簡(jiǎn)單的情況,只能用一次

public class MainActivity extends Activity {EditText show;Button bn;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);show = (EditText) findViewById(R.id.show);bn = (Button) findViewById(R.id.bn);// 直接使用Activity作為事件監(jiān)聽(tīng)器bn.setOnClickListener(new OnClickListener(){// 實(shí)現(xiàn)事件處理方法@Overridepublic void onClick(View v){show.setText("bn按鈕被單擊了!");}});}

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Android基于监听的事件处理机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。