Android 開發中,KeyEvent.KEYCODE_* 常數定義了所有可識別的按鍵代碼。很多開發者只知道返回鍵是 4,卻不清楚完整取值範圍、如何查閱,以及 KeyCode 的監聽是否只能用在 if 語句中。本文將提供完整參考表、查閱方法與多樣化的監聽模式。
KeyCode 為 int 常數,定義於 android.view.KeyEvent 類中,範圍大致 0 ~ 200+,按功能分類:
KeyEvent.KEYCODE_ 觸發補全列表。frameworks/base/core/java/android/view/KeyEvent.java 中 public static final int KEYCODE_... 定義區。Log.d("KEY", "code=" + event.getKeyCode()); 實測未知裝置按鍵。雖然 if (keyCode == KeyEvent.KEYCODE_BACK) 最常見,但實際開發有更靈活的模式:
String action = switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_BACK -> "BACK";
case KeyEvent.KEYCODE_HOME -> "HOME";
case KeyEvent.KEYCODE_MENU -> "MENU";
default -> "OTHER";
};
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();
優點:易擴展、符合開閉原則、便於單元測試。
將每個 KeyCode 對應的處理封裝為 KeyHandler 介面實現類,註冊到管理器,實現解耦。
PublishSubject keySubject = PublishSubject.create();
keySubject
.filter(e -> e.getAction() == KeyEvent.ACTION_DOWN)
.map(KeyEvent::getKeyCode)
.subscribe(code -> handleKey(code));
event.getUnicodeChar() 取字符。InputConnection,而非 KeyEvent。KeyCode 取值範圍固定且可查閱,監聽方式遠不止 if 語句。根據業務複雜度選擇 Switch、Map 查找表、策略模式或反應式流,能顯著提升代碼可維護性與擴展性。建議收藏官方常數表鏈接,遇到新裝置按鍵先打印 KeyCode 再查表處理。