版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
主講教師:日期:第6章
Android事件處理Android程序設(shè)計(jì)目錄/CONTENTS6.1基于監(jiān)聽的事件處理6.2基于回調(diào)的事件處理6.3響應(yīng)系統(tǒng)設(shè)置的事件6.4Handler消息傳遞機(jī)制1.掌握監(jiān)聽事件處理流程及使用方式。2.了解回調(diào)函數(shù)機(jī)制。3.掌握系統(tǒng)響應(yīng)事件的使用。學(xué)習(xí)目標(biāo)4.掌握Handler消息傳遞機(jī)制。6.1基于監(jiān)聽的事件處理6.1.1事件監(jiān)聽的處理模型事件發(fā)生的場所,通常就是各個組件,例如按鈕、窗口、菜單等。EventSource(事件源)事件封裝了界面組件上發(fā)生的特定事情(通常是一次用戶操作)。如果程序需要獲得界面組件上所發(fā)生事件的相關(guān)信息,一般通過Event對象來取得。Event(事件)負(fù)責(zé)監(jiān)聽事件源所發(fā)生的事件,并對各種事件做出相應(yīng)的響應(yīng)。EventListener(事件監(jiān)聽器)在事件監(jiān)聽的處理模型中,主要涉及如下三類對象:6.1基于監(jiān)聽的事件處理監(jiān)聽機(jī)制常用監(jiān)聽接口如下。(1)View.OnClickListener:單擊事件監(jiān)聽器必須實(shí)現(xiàn)的接口。(2)View.OnCreateContextMenuListener:創(chuàng)建上下文菜單事件。(3)View.OnFocusChangeListener:焦點(diǎn)改變事件。(4)View.OnKeyListener:按鍵事件監(jiān)聽器。(5)View.OnLongClickListener:長按事件監(jiān)聽器。(6)View.OnTouchListener:觸摸屏事件監(jiān)聽器。6.1基于監(jiān)聽的事件處理【例6-1】監(jiān)聽的事件處理模型示例。布局代碼如下:<LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"android:gravity="center_horizontal"><EditTextandroid:id="@+id/txt"android:layout_width="fill_parent"android:layout_height="wrap_content"android:cursorVisible="false"android:textSize="12pt"></EditText><!--定義一個按鈕,該按鈕將作為事件源--><Buttonandroid:id="@+id/bn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="單擊我試試"/></LinearLayout>6.1基于監(jiān)聽的事件處理Java代碼如下:publicclassMainActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//獲取應(yīng)用程序中的bn按鈕Buttonbn=(Button)findViewById(R.id.bn);//為該按鈕綁定事件監(jiān)聽器bn.setOnClickListener(newMyClickListener());}//定義一個單擊事件的監(jiān)聽器classMyClickListenerimplementsView.OnClickListener{@OverridepublicvoidonClick(Viewv){EditTexttext=(EditText)findViewById(R.id.txt);text.setText("按鈕被單擊了!");}}}6.1基于監(jiān)聽的事件處理運(yùn)行結(jié)果如圖6-2所示。6.1基于監(jiān)聽的事件處理6.1.2?創(chuàng)建監(jiān)聽器的方法ABCD在XML文件中“顯示指定按鈕的onClick屬性”匿名內(nèi)部類作為事件監(jiān)聽器自身類作為事件監(jiān)聽器BCDA核心代碼如下:內(nèi)部類作為事件監(jiān)聽器btnButton.setOnClickListener(newMyListener());classMyListenerimplementsOnClickListener{publicvoidonClick(Viewv){System.out.println("內(nèi)部類響應(yīng)單擊事件");}}核心代碼如下:<Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="onClick"android:text="Button1"/><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="onClick"android:text="Button2"/>核心代碼如下:btnButton.setOnClickListener(newOnClickListener(){publicvoidonClick(Viewv){System.out.println("匿名內(nèi)部類響應(yīng)按鈕單擊事件");}});核心代碼如下:publicclassButtonActivityextendsActivityimplementsOnClickListener{Buttonbtn1,btn2;protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_test_button);btn1=(Button)findViewById(R.id.button1);btn2=(Button)findViewById(R.id.button2);btn1.setOnClickListener(this);btn2.setOnClickListener(this);}}6.1基于監(jiān)聽的事件處理在XML文件中“顯示指定按鈕的onClick屬性”D核心Java代碼如下:publicclassTestButtonActivityextendsActivity{Buttonbtn1,btn2;Toasttst;protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_test_button);}publicvoidonClick(Viewv){switch(v.getId()){caseR.id.button1:tst=Toast.makeText(this,"111111111",Toast.LENGTH_SHORT);tst.show();break;caseR.id.button2:tst=Toast.makeText(this,"222222222",Toast.LENGTH_SHORT);tst.show();break;}}}6.1基于監(jiān)聽的事件處理6.1.3?在標(biāo)簽中綁定事件處理器【例6-2】在標(biāo)簽中綁定事件處理器的實(shí)現(xiàn)過程。布局代碼如下:<RelativeLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentTop="true"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="測試"android:id="@+id/textView"android:textSize="32dp"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="單擊我試試"android:id="@+id/button"android:onClick="clickButton"/></LinearLayout></RelativeLayout>6.1基于監(jiān)聽的事件處理Java代碼如下:publicclassMainActivityextendsAppCompatActivity{TextViewtView;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/*實(shí)現(xiàn)clickButton方法*/publicvoidclickButton(Viewview){tView=(TextView)findViewById(R.id.textView);tView.setText("按鈕被單擊了");}}6.1基于監(jiān)聽的事件處理運(yùn)行結(jié)果如圖6-3所示。6.2基于回調(diào)的事件處理6.2.1?回調(diào)機(jī)制21自定義View類繼承自需要的ViewUI類。例如,自定義MyButton按鈕類extends基礎(chǔ)Button類。回調(diào)事件應(yīng)用步驟復(fù)寫回調(diào)函數(shù)例如“publicbooleanonTouchEvent(MotionEventevent)”。每一個事件回調(diào)方法都會返回一個boolean值。如果返回true,表示該事件已被處理,不再繼續(xù)向外擴(kuò)散;如果返回false,表示并沒有完全處理完該事件,更希望其他回調(diào)方法繼續(xù)對其進(jìn)行處理,例如Activity中的回調(diào)方法。6.2基于回調(diào)的事件處理【例6-3】回調(diào)事件示例,代碼如下:#定義接口publicinterfaceOnClickListener{publicvoidOnClick(Buttonb);}#定義ButtonpublicclassButton{OnClickListenerlistener;publicvoidclick(){listener.OnClick(this);}publicvoidsetOnClickListener(OnClickListenerlistener){this.listener=listener;}}#將接口對象OnClickListener賦給Button的接口成員publicclassActivity{publicActivity(){}publicstaticvoidmain(String[]args){Buttonbutton=newButton();button.setOnClickListener(newOnClickListener(){@OverridepublicvoidOnClick(Buttonb){System.out.println("clicked");}});button.click();}}6.2基于回調(diào)的事件處理6.2.2?基于回調(diào)的事件處理機(jī)制1.自定義View常見View組件的回調(diào)方法如下:(1)在該組件上觸發(fā)屏幕事件:booleanonTouchEvent(MotionEventevent);(2)在該組件上按下某個按鈕時:booleanonKeyDown(intkeyCode,KeyEventevent);(3)松開組件上的某個按鈕時:booleanonKeyUp(intkeyCode,KeyEventevent);(4)長按組件某個按鈕時:booleanonKeyLongPress(intkeyCode,KeyEventevent);(5)鍵盤快捷鍵事件發(fā)生:booleanonKeyShortcut(intkeyCode,KeyEventevent);(6)在組件上觸發(fā)軌跡球屏事件:booleanonTrackballEvent(MotionEventevent);(7)當(dāng)組件的焦點(diǎn)發(fā)生改變(和前面的6個不同,這個方法只能夠在View中重寫):protectedvoidonFocusChanged(booleangainFocus,intdirection,RectpreviouslyFocusedRect);6.2基于回調(diào)的事件處理2.基于回調(diào)的事件傳播6.3響應(yīng)系統(tǒng)設(shè)置的事件6.3.1?Configuration類Configuration類專門用于描述手機(jī)設(shè)備上的配置信息,這些配置信息既包括用戶特定的配置項(xiàng),也包括系統(tǒng)的動態(tài)設(shè)置配置。(1)publicfloatfontScale:獲取當(dāng)前用戶設(shè)置的字體的縮放因子。(2)publicintkeyboard:獲取當(dāng)前設(shè)備所關(guān)聯(lián)的鍵盤類型。(3)publicintkeyboardHidden:該屬性返回一個boolean值用于標(biāo)識當(dāng)前鍵盤是否可用。該屬性不僅會判斷系統(tǒng)的硬鍵盤,也會判斷系統(tǒng)的軟鍵盤(位于屏幕上)。(4)publicLocalelocale:獲取用戶當(dāng)前的Locale。(5)publicintmcc:獲取移動信號的國家碼。(6)publicintmnc:獲取移動信號的網(wǎng)絡(luò)碼。(7)publicintnavigation:判斷系統(tǒng)上方向?qū)Ш皆O(shè)備的類型。(8)publicintorientation:獲取系統(tǒng)屏幕的方向。(9)publicinttouchscreen:獲取系統(tǒng)觸摸屏的觸摸方式。6.3響應(yīng)系統(tǒng)設(shè)置的事件【例6-4】Configuration用法示例,該程序可以獲取系統(tǒng)的屏幕方向、觸摸屏方式等。布局代碼如下:<LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><EditTextandroid:id="@+id/ori"android:layout_width="match_parent"android:layout_height="wrap_content"/><EditTextandroid:id="@+id/navigation"android:layout_width="match_parent"android:layout_height="wrap_content"/><EditTextandroid:id="@+id/touch"android:layout_width="match_parent"android:layout_height="wrap_content"/><EditTextandroid:id="@+id/mnc"android:layout_width="match_parent"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/bn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="獲取系統(tǒng)設(shè)備狀態(tài)"/></LinearLayout>6.3響應(yīng)系統(tǒng)設(shè)置的事件Java代碼如下:publicclassMainActivityextendsActivity{EditTextori;EditTextnavigation;EditTexttouch;EditTextmnc;Buttonbn;protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ori=(EditText)findViewById(R.id.ori);navigation=(EditText)findViewById(R.id.navigation);touch=(EditText)findViewById(R.id.touch);mnc=(EditText)findViewById(R.id.mnc);Buttonbn=(Button)findViewById(R.id.bn);bn.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Configurationcfg=getResources().getConfiguration();Stringscreen=cfg.orientation==Configuration.ORIENTATION_LANDSCAPE?"橫向屏幕":"豎向屏幕";StringmncCode=cfg.mnc+"";StringnaviName=cfg.orientation==Configuration.NAVIGATION_NONAV?"沒有方向控制":cfg.orientation==Configuration.NAVIGATION_WHEEL?"滾輪控制方向":cfg.orientation==Configuration.NAVIGATION_DPAD?"方向鍵控制方向":"軌跡球控制方向";navigation.setText(naviName);StringtouchName=cfg.touchscreen==Configuration.TOUCHSCREEN_NOTOUCH?"無觸摸屏":"支持觸摸屏";ori.setText(screen);mnc.setText(mncCode);touch.setText(touchName);}});}}6.3響應(yīng)系統(tǒng)設(shè)置的事件運(yùn)行結(jié)果如圖6-4所示。6.3響應(yīng)系統(tǒng)設(shè)置的事件6.3.2?onConfigurationChanged方法使用onConfiguration方法大致分成兩步:(1)在Manifest文件中對Activity注冊的地方加入android:onConfigurationChanged:其后有若干個選項(xiàng),可以根據(jù)需要選擇。(2)在繼承自Activity的類里回調(diào)一個函數(shù)onConfiguration(),在函數(shù)里寫好回調(diào)的方法。6.3響應(yīng)系統(tǒng)設(shè)置的事件【例6-5】onConfigurationChanged方法的實(shí)現(xiàn)過程。布局代碼如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><Buttonandroid:id="@+id/btn1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="更改屏幕方向"/></LinearLayout>6.3響應(yīng)系統(tǒng)設(shè)置的事件Java文件如下:publicclassMainActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//獲得改變系統(tǒng)布局的按鈕Buttonbtn=(Button)findViewById(R.id.btn1);btn.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){Configurationconfig=getResources().getConfiguration();if(config.orientation==Configuration.ORIENTATION_LANDSCAPE){//設(shè)為豎屏MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);}//如果當(dāng)前是豎屏if(config.orientation==Configuration.ORIENTATION_PORTRAIT){//設(shè)為橫屏MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}}});}//重寫該方法,用于監(jiān)聽系統(tǒng)設(shè)置的更改,主要是監(jiān)控屏幕方向的更改@OverridepublicvoidonConfigurationChanged(ConfigurationnewConfig){super.onConfigurationChanged(newConfig);Stringscreen=newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE?"橫屏":"豎屏";Toast.makeText(this,"系統(tǒng)屏幕方向發(fā)生改變"+"\n修改后的屏幕方向?yàn)椋?+screen,Toast.LENGTH_LONG).show();}}6.3響應(yīng)系統(tǒng)設(shè)置的事件運(yùn)行結(jié)果如圖6-5所示。6.4Handler消息傳遞機(jī)制6.4.1?Handler類Handler類發(fā)送、處理消息的方法如下:(1)handleMessage(Messagemsg):處理消息的方法。該方法通常用于被重寫。(2)hasMessages(intwhat):檢查消息隊(duì)列中是否包含what屬性為指定值的消息。(3)hasMessages(intwhat,Objectobject):檢查消息隊(duì)列中是否包含what屬性為指定值且object屬性為指定對象的消息。(4)sendEmptyMessage(intwhat):發(fā)送空消息。(5)sendEmptyMessageDelayed(intwhat,longdelayMillis):指定多少毫秒之后發(fā)送空消息。(6)sendMessage(Messagemsg):立即發(fā)送消息。(7)sendMessageDelayed(Messagemsg,longdelayMillis):指定多少毫秒之后發(fā)送消息。6.3響應(yīng)系統(tǒng)設(shè)置的事件【例6-6】模擬一個簡單的相冊查看器,每隔2秒自動更換下一張照片。布局代碼如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center"><ImageViewandroid:id="@+id/imageView"android:layout_width="fill_parent"android:layout_height="wrap_content"android:src="@drawable/p1"android:gravity="center"/></LinearLayout>6.3響應(yīng)系統(tǒng)設(shè)置的事件Java代碼如下:publicclassMainActivityextendsActivity{privateImageViewimageView=null;privateHandlerhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){switch(msg.what){case0:imageView.setImageResource(R.drawable.p1);break;case1:imageView.setImageResource(R.drawable.p2);break;case2:imageView.setImageResource(R.drawable.p3);break;case3:imageView.setImageResource(R.drawable.p4);break;}super.handleMessage(msg);}}@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView=(ImageView)findViewById(R.id.imageView);thread.start();}intwhat=0;Threadthread=newThread(newRunnable(){publicvoidrun(){while(true){handler.sendEmptyMessage((what++)%4);try{Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();}}}});}6.3響應(yīng)系統(tǒng)設(shè)置的事件運(yùn)行結(jié)果如圖6-6所示。6.4Handler消息傳遞機(jī)制6.4.2?消息傳遞機(jī)制1.Handler、Looper及MessageQueue三者的關(guān)系Handler負(fù)責(zé)消息的封裝,和讀取消息:new一個looper對象會在構(gòu)造方法中調(diào)用new一個MessageQueue,然后循環(huán)讀取MessageQueue里的Message,如果消息不為null,則交給Handler處理。負(fù)責(zé)發(fā)送消息和接收消息:new一個Handler對象會在構(gòu)造方法中調(diào)用Looper.myLooper方法獲取一個Looper對象,然后從Looper對象獲取到MessageQueue對象,Handler將要發(fā)送的Message存放到MessageQueue,looper循環(huán)獲取MessageQueue里的消息,如果消息不為null,則交給Message的tar
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安順市消防救援支隊(duì)2026年面向社會公開招聘政府專職消防員的備考題庫(第一批)完整答案詳解
- 公共交通車輛安全技術(shù)檢測制度
- 2026年派駐天津市對外服務(wù)有限公司人力資源管理崗位(北方人力外包項(xiàng)目)招聘備考題庫及答案詳解一套
- 2026年鹽城市大豐區(qū)司法局公開招聘勞務(wù)派遣人員備考題庫完整參考答案詳解
- 2026年江達(dá)縣城市管理局公開招聘輔助執(zhí)法人員的備考題庫及一套答案詳解
- 企業(yè)員工晉升與發(fā)展制度
- 2026年正定產(chǎn)業(yè)投資控股集團(tuán)有限公司面向社會招聘職業(yè)經(jīng)理人的備考題庫含答案詳解
- 2026年楊寶軍研究組招聘備考題庫及參考答案詳解一套
- 養(yǎng)老院老人興趣小組活動制度
- 企業(yè)員工培訓(xùn)與素質(zhì)提升目標(biāo)制度
- 質(zhì)量效應(yīng)2楷模路線文字版
- 消防設(shè)施檢查記錄表
- 酒店協(xié)議價合同
- 哈爾濱工業(yè)大學(xué)簡介宣傳介紹
- 青光眼的藥物治療演示
- 中國兒童錯頜畸形早期矯治專家共識
- 羅永浩海淀劇場演講
- 蘇州市公務(wù)員考核實(shí)施細(xì)則
- GB/T 5147-2003漁具分類、命名及代號
- GB/T 2703-2017鞋類術(shù)語
- GB/T 21010-2007土地利用現(xiàn)狀分類
評論
0/150
提交評論