首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android KeyCode 取值範圍完整指南與監聽用法

     編輯:程式設計綜合問答

前言

Android 開發中,KeyEvent.KEYCODE_* 常數定義了所有可識別的按鍵代碼。很多開發者只知道返回鍵是 4,卻不清楚完整取值範圍、如何查閱,以及 KeyCode 的監聽是否只能用在 if 語句中。本文將提供完整參考表、查閱方法與多樣化的監聽模式。

KeyCode 取值範圍與分類

KeyCode 為 int 常數,定義於 android.view.KeyEvent 類中,範圍大致 0 ~ 200+,按功能分類:

  • 導航鍵:BACK(4)、HOME(3)、MENU(82)、DPAD 方向鍵(19-23)
  • 功能鍵:POWER(26)、CAMERA(27)、VOLUME_UP/DOWN(24/25)、SEARCH(84)
  • 數字鍵:KEYCODE_0~9 (7~16)
  • 字母鍵:KEYCODE_A~Z (29~54)
  • 符號鍵:SPACE(62)、ENTER(66)、DEL(67)、TAB(61) 等
  • 多媒體鍵:MEDIA_PLAY/PAUSE/STOP/NEXT/PREVIOUS (85~91)
  • 遊戲手柄:BUTTON_A/B/X/Y/L/R/THUMBL/THUMBR 等 (96~)
  • 專用鍵:CALL(5)、ENDCALL(6)、HEADSETHOOK(79) 等

如何快速查閱完整 KeyCode 列表

  1. 官方文檔:KeyEvent Constants —— 最權威、最新。
  2. IDE 自動補全:輸入 KeyEvent.KEYCODE_ 觸發補全列表。
  3. 原始碼:frameworks/base/core/java/android/view/KeyEvent.java 中 public static final int KEYCODE_... 定義區。
  4. 運行時打印:Log.d("KEY", "code=" + event.getKeyCode()); 實測未知裝置按鍵。

KeyCode 監聽不只能用在 if 語句

雖然 if (keyCode == KeyEvent.KEYCODE_BACK) 最常見,但實際開發有更靈活的模式:

1. Switch 表達式(Java 12+ / Android API 24+)

String action = switch (event.getKeyCode()) {
    case KeyEvent.KEYCODE_BACK -> "BACK";
    case KeyEvent.KEYCODE_HOME -> "HOME";
    case KeyEvent.KEYCODE_MENU -> "MENU";
    default -> "OTHER";
};

2. Map/查找表 驅動邏輯

Map keyActions = new HashMap<>();
keyActions.put(KeyEvent.KEYCODE_BACK, this::onBackPressed);
keyActions.put(KeyEvent.KEYCODE_MENU, this::openMenu);
keyActions.put(KeyEvent.KEYCODE_DPAD_CENTER, this::onSelect);

Runnable action = keyActions.get(event.getKeyCode());
if (action != null) action.run();

優點:易擴展、符合開閉原則、便於單元測試。

3. 指令模式 / 策略模式

將每個 KeyCode 對應的處理封裝為 KeyHandler 介面實現類,註冊到管理器,實現解耦。

4. RxJava / Flow 反應式流

PublishSubject keySubject = PublishSubject.create();
keySubject
    .filter(e -> e.getAction() == KeyEvent.ACTION_DOWN)
    .map(KeyEvent::getKeyCode)
    .subscribe(code -> handleKey(code));

常見誤區提醒

  • KeyCode ≠ ASCII/Unicode:字母鍵 KeyCode (29~54) 不等同字符碼,需配合 event.getUnicodeChar() 取字符。
  • 部分系統鍵不可攔截:HOME、POWER、長按電源鍵等由系統底層處理,App 無法收到事件。
  • 軟鍵盤輸入不走 KeyEvent:EditText 輸入法輸入觸發 InputConnection,而非 KeyEvent。

總結

KeyCode 取值範圍固定且可查閱,監聽方式遠不止 if 語句。根據業務複雜度選擇 Switch、Map 查找表、策略模式或反應式流,能顯著提升代碼可維護性與擴展性。建議收藏官方常數表鏈接,遇到新裝置按鍵先打印 KeyCode 再查表處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved