Android 攔截返回鍵事件的實例詳解
Android 攔截返回鍵事件的實例詳解
KeyEvent類
Android.View.KeyEvent類中定義了一系列的常量和方法,用來描述Android中的
按鍵事件和返回鍵有關(guān)的常量和方法有。
- KeyEvent.KEYCODE_BACK: 表示key類型為返回鍵
- KeyEvent.ACTION_DOWN:表示事件為按下key,如果一直按住不放,則會不停產(chǎn)生此事件。
- KeyEvent.ACTION_UP:表示事件為為放開key,一次點擊key過程只會調(diào)用一次。
- public final int getKeyCode():獲取此事件對應(yīng)的key類型。
- public final int getAction():獲取此事件對應(yīng)的事件類型
Activity中攔截返回鍵
在Activity的派生類中可以通過重寫onKeyDown和onKeyUp這兩個方法來攔截返回鍵。這兩個方法的原型為。
public boolean onKeyDown(int keyCode, KeyEvent event); public boolean onKeyUp(int keyCode, KeyEvent event);
這兩個方法都有兩個參數(shù),第一個參數(shù)為keyCode,即此事件對應(yīng)的key類型。第二個參數(shù)為此事件對象,
通過event可以獲取到事件的詳細信息。onKeyDown()方法中event.getAction()返回的始終是KeyEvent.ACTION_DOWN,onKeyUp()方法中event.getAction()返回的始終是KeyEvent.ACTION_UP。
如果要攔截返回鍵,則在兩個方法中加入如下代碼。
if (keyCode == KeyEvent.KEYCODE_BACK) {
...
}
Dialog中攔截返回鍵
在Dialog中可以通過調(diào)用setOnKeyListener()方法來為Dialog增加按鍵事件的監(jiān)聽。
setOnKeyListener()方法原型為:
public void setOnKeyListener(final OnKeyListener onKeyListener);
此方法有一個參數(shù),參數(shù)需要實現(xiàn)OnKeyListener接口。OnKeyListener接口定義如下。
interface OnKeyListener {
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event);
}
onKey()方法包含三個參數(shù),第一個參數(shù)是攔截到此事件的對話框?qū)ο蟮囊?。第二個參數(shù)是此事件對應(yīng)的keyCode,第三個參數(shù)是此事件對象本身。
如果要攔截返回鍵,則在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中同樣可以通過調(diào)用setOnKeyListener()方法來為EditText增加按鍵事件的監(jiān)聽。
setOnKeyListener()方法的使用和Dialog中完全相同。
View中攔截返回鍵事件
在所有View的派生類對象上都可以調(diào)用setOnKeyListener()方法來增加按鍵事件的監(jiān)聽,不過除了EditText之外,其他View設(shè)置了監(jiān)聽并不會起到作用。按鍵事件產(chǎn)生時并不會分發(fā)到View上。
多個攔截事件的沖突與選擇
目前在Activity,Dialog和EditText中都可以成功設(shè)置攔截事件。如果多個對象設(shè)置了攔截事件。則事件只會分發(fā)到一個對象上。
通過實驗得到如下結(jié)論:
1、Dialog優(yōu)先級最高,如果有一個Activity,Activity中彈出一個Dialog,Dialog中有一個EditText,在Activity,Dialog和EditText中都設(shè)置監(jiān)聽,只有Dialog中設(shè)置的監(jiān)聽過程能夠正確執(zhí)行。Activity和EditText中的監(jiān)聽過程無法被執(zhí)行到。
2、Activity優(yōu)先級次于Dialog,但高于EditText,如果有一個Activity,Activity中有一個EditText,在Activity和EditText中都設(shè)置監(jiān)聽,只有Activity中設(shè)置的監(jiān)聽過程能夠正確執(zhí)行。EditText中的監(jiān)聽過程無法被執(zhí)行到。
3、如果當(dāng)前界面中有PopupWindow,則按返回鍵后PopupWindow會收到事件通知,并消費(執(zhí)行dismiss();)。其他設(shè)置了監(jiān)聽的對象無法獲取到事件通知。(原因是PopupWindow內(nèi)部布局類PopupViewContainer重寫了dispatchKeyEvent()方法)
返回鍵響應(yīng)速度限制
當(dāng)用戶在按返回鍵后,如果界面出現(xiàn)卡頓,導(dǎo)致界面沒有立刻完成返回動作,這時用戶可能覺得是按下操作沒有成功,又再一次按下返回鍵。這會導(dǎo)致返回事件又一次被調(diào)用。當(dāng)卡頓結(jié)束后就出現(xiàn)多次返回的現(xiàn)象。為了避免這種情況出現(xiàn),可以在攔截返回鍵的函數(shù)中增加時間限制。即如果本次返回事件距離上次處理時間過段,則不處理本次事件。直接return true;消費此次事件。
以對話框中攔截返回鍵舉例,增加返回鍵響應(yīng)速度限制的代碼如下。
setOnKeyListener(new OnKeyListener() {
private static final int INTERVAL = 500; //響應(yīng)間隔時間
private long lastReturnTime; //上次響應(yīng)返回事件時間
@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;
}
});
如有疑問請留言或者到本站社區(qū)交流討論,希望通過本文能幫助到大家,感謝閱讀,謝謝大家對本站的支持!
相關(guān)文章
Android編程開發(fā)之EditText中不輸入特定字符會顯示相關(guān)提示信息的方法
這篇文章主要介紹了Android編程開發(fā)之EditText中不輸入特定字符會顯示相關(guān)提示信息的方法,涉及Android針對EditText的布局操作及內(nèi)容判定相關(guān)技巧,需要的朋友可以參考下2015-12-12
Android程序開發(fā)之手機APP創(chuàng)建桌面快捷方式
這篇文章主要介紹了Android程序開發(fā)之手機APP創(chuàng)建桌面快捷方式 的相關(guān)資料,需要的朋友可以參考下2016-04-04
Android自定義View實現(xiàn)支付寶咻一咻效果
這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)支付寶咻一咻效果的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
Android編程實現(xiàn)禁止?fàn)顟B(tài)欄下拉的方法詳解
這篇文章主要介紹了Android編程實現(xiàn)禁止?fàn)顟B(tài)欄下拉的方法,結(jié)合實例形式詳細分析了Android狀態(tài)欄操作相關(guān)的函數(shù)、屬性調(diào)用及權(quán)限控制設(shè)置技巧,需要的朋友可以參考下2017-08-08

