Android onKeyDown事件詳解


一、前言:

本篇文章介紹如何在Android中實現監聽返回鍵,主鍵,菜單鍵。一般情況下,我們都可以在Android手機底部看到三個按鈕,這三個按鈕就分別是返回鍵,主鍵,菜單鍵。

接下來介紹監聽這三個鍵的實現。

二、監聽返回鍵

1、第一種方法通過onBackPressed()方法來實現

/**
* 注意:
* super.onBackPressed()會自動調用finish()方法,關閉當前Activity.
*/
@Override
public void onBackPressed() {
super.onBackPressed();
Toast.makeText(this, "按下了back鍵 onBackPressed()", Toast.LENGTH_SHORT).show();
}

說明:onBackPressed()提供的功能有限,它這是在退出之前通知onBackPressed()方法,並不能改變用戶原來的行為

2、利用onKeyDown方法,就可以實現

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
      if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            Toast.makeText(this, "按下了back鍵 onKeyDown()", Toast.LENGTH_SHORT).show();
            return false;
       }else {
            return super.onKeyDown(keyCode, event);
      }
}

 

說明:onKeyDown方法返回true表示退出,返回false便不退出。

3、還可以通過跳轉來實現退出

1 @Override
2 public boolean onKeyDown(int keyCode, KeyEvent event) {
3       if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){
4             Intent intent = new Intent(Intent.ACTION_MAIN);
5             intent.addCategory(Intent.CATEGORY_HOME);
6             startActivity(intent);
7      }
8     return super.onKeyDown(keyCode, event);
9 }

 

4、通過onKeyDown我們可以實現,實現“再按一次返回鍵退出程序”的功能

 1 private long exitTime = 0;
 2 @Override
 3 public boolean onKeyDown(int keyCode, KeyEvent event) {
 4        if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){
 5              if((System.currentTimeMillis()-exitTime) > 2000){
 6                     Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
 7                    exitTime = System.currentTimeMillis();
 8              } else {
 9                     finish();
10                     System.exit(0);
11               }
12         return true;
13 }
14  return super.onKeyDown(keyCode, event);
15 }

 

三、監聽 主鍵(Home鍵)

監聽Home鍵可以通過onUserLeaveHint()方法來實現,

1 @Override
2 protected void onUserLeaveHint() {
3       super.onUserLeaveHint();
4       Toast.makeText(this, "onUserLeaveHint", Toast.LENGTH_SHORT).show();
5 }

 

說明:在這個方法中,我們可以觀察出,如果onUserLeaveHint方法是不能改變用戶的行為的。

四、監聽 菜單鍵

在手機下方的三個鍵中,最右邊的鍵就是菜單鍵,通常是用方括號表示的。經過筆者的測試發現,如果輕點一下,那么會跳出菜單界面,如果長點的話,那么會退出程序。這個過程會自動調用onUserLeaveHint方法,也就是主鍵。

1、菜單的監聽也可以通過onKeyDown()方法來實現

1 @Override
2 public boolean onKeyDown(int keyCode, KeyEvent event) {
3      if (keyCode == KeyEvent.KEYCODE_MENU) {
4         Toast.makeText(this, "onkeyDown clicked", Toast.LENGTH_SHORT)
5                 .show();
6         super.openOptionsMenu(); // 調用這個,就可以彈出菜單
7       }
8       return true; // 最后,一定要做完以后返回 true,或者在彈出菜單后返回true,其他鍵返回super,讓其他鍵默認
9 }

 

2、處理上面這樣的方法,onOptionsMenuClosed()方法也可以實現。

1 @Override
2 public void onOptionsMenuClosed(Menu menu) {
3        super.onOptionsMenuClosed(menu);
4         Toast.makeText(this, "onOptionsMenuClosed clicked", Toast.LENGTH_SHORT)
5 .show();
6 }

 

經過筆者的測試,發生這些方法在高版本中可能出現不兼容的情況,關於菜單可以查看 Android中Menu菜單

五、onKeyDown詳解:

監聽返回鍵,通過在 Activity 中重寫onKeyDown方法。

1  override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
2         return super.onKeyDown(keyCode, event)
3     }

 

  • onKeyDown方法,該方法是接口KeyEvent.Callback中的抽象方法,所有的View全部實現了該接口並重寫了該方法,該方法用來捕捉手機鍵盤被按下的事件。

  • 參數keyCode,該參數指的是被按下的鍵的鍵盤碼,手機鍵盤中每個按鈕都會有其對應的鍵盤碼,在應用程序都是通過鍵盤碼才知道用戶按下的是哪個鍵。

  • 當用戶按下按鍵時,系統會自動將事件封裝成KeyEvent對象供應用程序使用。按鍵事件KeyEvent按鍵事件有多種常量類型,比如 KEYCODE_BACK

  • 返回值,該方法的返回值為一個boolean類型的變量,當返回true時,表示已經完整地處理了這個事件,並不希望其他的回調方法再次進行處理,而當返回false時,表示並沒有完全處理完該事件,更希望其他回調方法繼續對其進行處理,例如Activity中的回調方法。


鏈接:https://www.jianshu.com/p/9da340c237d3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM