Android 攔截返回鍵事件的實(shí)例詳解
Android 攔截返回鍵事件的實(shí)例詳解
KeyEvent類(lèi)
Android.View.KeyEvent類(lèi)中定義了一系列的常量和方法,用來(lái)描述Android中的
按鍵事件和返回鍵有關(guān)的常量和方法有。
- KeyEvent.KEYCODE_BACK: 表示key類(lèi)型為返回鍵
- KeyEvent.ACTION_DOWN:表示事件為按下key,如果一直按住不放,則會(huì)不停產(chǎn)生此事件。
- KeyEvent.ACTION_UP:表示事件為為放開(kāi)key,一次點(diǎn)擊key過(guò)程只會(huì)調(diào)用一次。
- public final int getKeyCode():獲取此事件對(duì)應(yīng)的key類(lèi)型。
- public final int getAction():獲取此事件對(duì)應(yīng)的事件類(lèi)型
Activity中攔截返回鍵
在Activity的派生類(lèi)中可以通過(guò)重寫(xiě)onKeyDown和onKeyUp這兩個(gè)方法來(lái)攔截返回鍵。這兩個(gè)方法的原型為。
public boolean onKeyDown(int keyCode, KeyEvent event); public boolean onKeyUp(int keyCode, KeyEvent event);
這兩個(gè)方法都有兩個(gè)參數(shù),第一個(gè)參數(shù)為keyCode,即此事件對(duì)應(yīng)的key類(lèi)型。第二個(gè)參數(shù)為此事件對(duì)象,
通過(guò)event可以獲取到事件的詳細(xì)信息。onKeyDown()方法中event.getAction()返回的始終是KeyEvent.ACTION_DOWN,onKeyUp()方法中event.getAction()返回的始終是KeyEvent.ACTION_UP。
如果要攔截返回鍵,則在兩個(gè)方法中加入如下代碼。
if (keyCode == KeyEvent.KEYCODE_BACK) { ... }
Dialog中攔截返回鍵
在Dialog中可以通過(guò)調(diào)用setOnKeyListener()方法來(lái)為Dialog增加按鍵事件的監(jiān)聽(tīng)。
setOnKeyListener()方法原型為:
public void setOnKeyListener(final OnKeyListener onKeyListener);
此方法有一個(gè)參數(shù),參數(shù)需要實(shí)現(xiàn)OnKeyListener接口。OnKeyListener接口定義如下。
interface OnKeyListener { public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event); }
onKey()方法包含三個(gè)參數(shù),第一個(gè)參數(shù)是攔截到此事件的對(duì)話(huà)框?qū)ο蟮囊?。第二個(gè)參數(shù)是此事件對(duì)應(yīng)的keyCode,第三個(gè)參數(shù)是此事件對(duì)象本身。
如果要攔截返回鍵,則在Dialog中加入如下代碼。
setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { ... } return false; } });
EditText中攔截返回鍵事件
在EditText中同樣可以通過(guò)調(diào)用setOnKeyListener()方法來(lái)為EditText增加按鍵事件的監(jiān)聽(tīng)。
setOnKeyListener()方法的使用和Dialog中完全相同。
View中攔截返回鍵事件
在所有View的派生類(lèi)對(duì)象上都可以調(diào)用setOnKeyListener()方法來(lái)增加按鍵事件的監(jiān)聽(tīng),不過(guò)除了EditText之外,其他View設(shè)置了監(jiān)聽(tīng)并不會(huì)起到作用。按鍵事件產(chǎn)生時(shí)并不會(huì)分發(fā)到View上。
多個(gè)攔截事件的沖突與選擇
目前在Activity,Dialog和EditText中都可以成功設(shè)置攔截事件。如果多個(gè)對(duì)象設(shè)置了攔截事件。則事件只會(huì)分發(fā)到一個(gè)對(duì)象上。
通過(guò)實(shí)驗(yàn)得到如下結(jié)論:
1、Dialog優(yōu)先級(jí)最高,如果有一個(gè)Activity,Activity中彈出一個(gè)Dialog,Dialog中有一個(gè)EditText,在Activity,Dialog和EditText中都設(shè)置監(jiān)聽(tīng),只有Dialog中設(shè)置的監(jiān)聽(tīng)過(guò)程能夠正確執(zhí)行。Activity和EditText中的監(jiān)聽(tīng)過(guò)程無(wú)法被執(zhí)行到。
2、Activity優(yōu)先級(jí)次于Dialog,但高于EditText,如果有一個(gè)Activity,Activity中有一個(gè)EditText,在Activity和EditText中都設(shè)置監(jiān)聽(tīng),只有Activity中設(shè)置的監(jiān)聽(tīng)過(guò)程能夠正確執(zhí)行。EditText中的監(jiān)聽(tīng)過(guò)程無(wú)法被執(zhí)行到。
3、如果當(dāng)前界面中有PopupWindow,則按返回鍵后PopupWindow會(huì)收到事件通知,并消費(fèi)(執(zhí)行dismiss();)。其他設(shè)置了監(jiān)聽(tīng)的對(duì)象無(wú)法獲取到事件通知。(原因是PopupWindow內(nèi)部布局類(lèi)PopupViewContainer重寫(xiě)了dispatchKeyEvent()方法)
返回鍵響應(yīng)速度限制
當(dāng)用戶(hù)在按返回鍵后,如果界面出現(xiàn)卡頓,導(dǎo)致界面沒(méi)有立刻完成返回動(dòng)作,這時(shí)用戶(hù)可能覺(jué)得是按下操作沒(méi)有成功,又再一次按下返回鍵。這會(huì)導(dǎo)致返回事件又一次被調(diào)用。當(dāng)卡頓結(jié)束后就出現(xiàn)多次返回的現(xiàn)象。為了避免這種情況出現(xiàn),可以在攔截返回鍵的函數(shù)中增加時(shí)間限制。即如果本次返回事件距離上次處理時(shí)間過(guò)段,則不處理本次事件。直接return true;消費(fèi)此次事件。
以對(duì)話(huà)框中攔截返回鍵舉例,增加返回鍵響應(yīng)速度限制的代碼如下。
setOnKeyListener(new OnKeyListener() { private static final int INTERVAL = 500; //響應(yīng)間隔時(shí)間 private long lastReturnTime; //上次響應(yīng)返回事件時(shí)間 @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { long curTime = System.currentTimeMillis(); if (curTime - lastReturnTime > INTERVAL) { lastReturnTime = curTime; ... } else { return true; } } return false; } });
如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,希望通過(guò)本文能幫助到大家,感謝閱讀,謝謝大家對(duì)本站的支持!
相關(guān)文章
android系統(tǒng)拍照結(jié)合android-crop裁剪圖片
這篇文章主要為大家詳細(xì)介紹android系統(tǒng)拍照結(jié)合android-crop裁剪圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Android 編程下字庫(kù)的使用及注意事項(xiàng)
在安卓操作系統(tǒng)下對(duì)于 TextView 字體的支持非常有限,默認(rèn)情況下TextView的typeface屬性支持三種字體;接下來(lái)本文將會(huì)介紹Android 編程下字庫(kù)的使用及注意事項(xiàng),感興趣的朋友可以了解下,希望對(duì)你有所幫助2013-01-01android實(shí)現(xiàn)簡(jiǎn)易登錄注冊(cè)界面及邏輯設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)簡(jiǎn)易登錄注冊(cè)界面及邏輯設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06Android 模仿QQ側(cè)滑刪除ListView功能示例
這篇文章主要介紹了Android 模仿QQ側(cè)滑刪除ListView功能示例,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03Android訪(fǎng)問(wèn)assets本地json文件的方法
這篇文章主要介紹了Android訪(fǎng)問(wèn)assets本地json文件的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Android開(kāi)發(fā)學(xué)習(xí)路線(xiàn)的七大階段
這篇文章主要介紹了Android開(kāi)發(fā)學(xué)習(xí)路線(xiàn)的七大階段,本文講解了Java面向?qū)ο缶幊?、Java Web開(kāi)發(fā)、android UI編程、android網(wǎng)絡(luò)編程與數(shù)據(jù)存儲(chǔ)、android手機(jī)硬件管理等七大階段,需要的朋友可以參考下2015-04-04Android 判斷SIM卡屬于哪個(gè)移動(dòng)運(yùn)營(yíng)商詳解及實(shí)例
這篇文章主要介紹了Android 判斷SIM卡屬于哪個(gè)移動(dòng)運(yùn)營(yíng)商詳解相關(guān)資料,并附實(shí)例代碼,具有一定參考價(jià)值,需要的朋友可以參考下2016-11-11Android 實(shí)現(xiàn)文件夾排序功能的實(shí)例代碼
這篇文章主要介紹了Android 實(shí)現(xiàn)文件夾排序功能的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2018-09-09詳解Android中提示對(duì)話(huà)框(ProgressDialog和DatePickerDialog和TimePickerDi
這篇文章主要介紹了詳解Android中提示對(duì)話(huà)框(ProgressDialog和DatePickerDialog和TimePickerDialog&PopupWindow)的相關(guān)資料,需要的朋友可以參考下2016-01-01Android開(kāi)發(fā)中Looper.prepare()和Looper.loop()
Looper用于封裝了android線(xiàn)程中的消息循環(huán),默認(rèn)情況下一個(gè)線(xiàn)程是不存在消息循環(huán)(message loop)的,具體調(diào)用方法大家可以通過(guò)本文學(xué)習(xí)2016-11-11