中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android 攔截返回鍵事件的實例詳解

發布時間:2020-08-23 23:02:05 來源:腳本之家 閱讀:771 作者:ccpat 欄目:移動開發

Android 攔截返回鍵事件的實例詳解

KeyEvent類

Android.View.KeyEvent類中定義了一系列的常量和方法,用來描述Android中的

按鍵事件和返回鍵有關的常量和方法有。

  • KeyEvent.KEYCODE_BACK: 表示key類型為返回鍵
  • KeyEvent.ACTION_DOWN:表示事件為按下key,如果一直按住不放,則會不停產生此事件。
  • KeyEvent.ACTION_UP:表示事件為為放開key,一次點擊key過程只會調用一次。
  • public final int getKeyCode():獲取此事件對應的key類型。
  • public final int getAction():獲取此事件對應的事件類型

Activity中攔截返回鍵

在Activity的派生類中可以通過重寫onKeyDown和onKeyUp這兩個方法來攔截返回鍵。這兩個方法的原型為。

public boolean onKeyDown(int keyCode, KeyEvent event);
public boolean onKeyUp(int keyCode, KeyEvent event);

這兩個方法都有兩個參數,第一個參數為keyCode,即此事件對應的key類型。第二個參數為此事件對象,
通過event可以獲取到事件的詳細信息。onKeyDown()方法中event.getAction()返回的始終是KeyEvent.ACTION_DOWN,onKeyUp()方法中event.getAction()返回的始終是KeyEvent.ACTION_UP。

如果要攔截返回鍵,則在兩個方法中加入如下代碼。

if (keyCode == KeyEvent.KEYCODE_BACK) {
  ...
}

Dialog中攔截返回鍵

在Dialog中可以通過調用setOnKeyListener()方法來為Dialog增加按鍵事件的監聽。

setOnKeyListener()方法原型為:

public void setOnKeyListener(final OnKeyListener onKeyListener);

此方法有一個參數,參數需要實現OnKeyListener接口。OnKeyListener接口定義如下。

interface OnKeyListener {
  public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event);
}

onKey()方法包含三個參數,第一個參數是攔截到此事件的對話框對象的引用。第二個參數是此事件對應的keyCode,第三個參數是此事件對象本身。

如果要攔截返回鍵,則在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中同樣可以通過調用setOnKeyListener()方法來為EditText增加按鍵事件的監聽。
setOnKeyListener()方法的使用和Dialog中完全相同。

View中攔截返回鍵事件

在所有View的派生類對象上都可以調用setOnKeyListener()方法來增加按鍵事件的監聽,不過除了EditText之外,其他View設置了監聽并不會起到作用。按鍵事件產生時并不會分發到View上。

多個攔截事件的沖突與選擇

目前在Activity,Dialog和EditText中都可以成功設置攔截事件。如果多個對象設置了攔截事件。則事件只會分發到一個對象上。
通過實驗得到如下結論:

1、Dialog優先級最高,如果有一個Activity,Activity中彈出一個Dialog,Dialog中有一個EditText,在Activity,Dialog和EditText中都設置監聽,只有Dialog中設置的監聽過程能夠正確執行。Activity和EditText中的監聽過程無法被執行到。

2、Activity優先級次于Dialog,但高于EditText,如果有一個Activity,Activity中有一個EditText,在Activity和EditText中都設置監聽,只有Activity中設置的監聽過程能夠正確執行。EditText中的監聽過程無法被執行到。

3、如果當前界面中有PopupWindow,則按返回鍵后PopupWindow會收到事件通知,并消費(執行dismiss();)。其他設置了監聽的對象無法獲取到事件通知。(原因是PopupWindow內部布局類PopupViewContainer重寫了dispatchKeyEvent()方法)

返回鍵響應速度限制

當用戶在按返回鍵后,如果界面出現卡頓,導致界面沒有立刻完成返回動作,這時用戶可能覺得是按下操作沒有成功,又再一次按下返回鍵。這會導致返回事件又一次被調用。當卡頓結束后就出現多次返回的現象。為了避免這種情況出現,可以在攔截返回鍵的函數中增加時間限制。即如果本次返回事件距離上次處理時間過段,則不處理本次事件。直接return true;消費此次事件。

以對話框中攔截返回鍵舉例,增加返回鍵響應速度限制的代碼如下。

setOnKeyListener(new OnKeyListener() {
  private static final int INTERVAL = 500;  //響應間隔時間
  private long lastReturnTime;        //上次響應返回事件時間
  @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;
  }
});

如有疑問請留言或者到本站社區交流討論,希望通過本文能幫助到大家,感謝閱讀,謝謝大家對本站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

莱州市| 通山县| 四会市| 汕尾市| 嵩明县| 民和| 沙河市| 迁安市| 报价| 梁平县| 沈丘县| 万安县| 建水县| 灵石县| 石首市| 买车| 蚌埠市| 阆中市| 淮安市| 龙门县| 天全县| 荃湾区| 新河县| 永年县| 科技| 甘泉县| 迭部县| 谢通门县| 汽车| 浦北县| 沈丘县| 呼玛县| 清徐县| 区。| 淮滨县| 兴安盟| 正安县| 上林县| 丰镇市| 绵阳市| 阿克|