在 Android 早期版本(實體 Menu 鍵設備)中,長按 Menu 鍵會強制彈出輸入法,干擾應用正常操作。需在 Activity 中攔截長按事件並消費掉。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean handled = super.onKeyDown(keyCode, event);
// 攔截 Menu 鍵長按事件,防止彈出輸入法
if (keyCode == KeyEvent.KEYCODE_MENU && event.isLongPress()) {
return true; // 消費事件,不再分發
}
return handled;
}
KeyEvent.KEYCODE_MENU:對應實體 Menu 鍵event.isLongPress():判斷是否為長按事件true 表示事件已處理,系統不再執行默認行為(彈出輸入法)Toolbar/ActionBar 而非傳統選單,可忽略此問題當前標準做法使用 Toolbar + onCreateOptionsMenu 實現溢出選單:
// Menu 資源 res/menu/main_menu.xml
<menu xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_settings"
android:title="@string/settings"
app:showAsAction="never" />
</menu>
// Activity
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_settings) {
// 處理點擊
return true;
}
return super.onOptionsItemSelected(item);
}
此問題屬於歷史遺留問題,現代 Android 開發(minSdk 21+)基本無需處理。若維護舊專案需兼容早期設備,可保留此攔截代碼。