כשהמשתמש מתמקד בתצוגת טקסט שניתנת לעריכה, כמו רכיב
EditText, וכשהמשתמש מחובר למקלדת חומרה, כל הקלט מטופל על ידי המערכת. עם זאת, אם רוצים ליירט את הקלט מהמקלדת או לטפל בו ישירות, אפשר לעשות זאת באמצעות הטמעה של שיטות קריאה חוזרת (callback) מהממשק KeyEvent.Callback, כמו onKeyDown() ו-onKeyMultiple().
המחלקות Activity ו-View מטמיעות את הממשק KeyEvent.Callback, ולכן בדרך כלל מחליפים את השיטות להחזרת קריאה בהרחבה של המחלקות האלה, לפי הצורך.
הערה: כשמטפלים באירועים במקלדת באמצעות המחלקה KeyEvent וממשקי API קשורים, צריך לצפות לכך שהאירועים במקלדת יגיעו רק ממקלדת חומרה. אל תסתמכו על קבלת אירועי מקשים עבור מקש כלשהו בשיטת קלט וירטואלית (מקלדת וירטואלית).
טיפול באירועים של מקש יחיד
כדי לטפל בלחיצה על מקש ספציפי, מטמיעים את
onKeyDown()
או את onKeyUp(), בהתאם לצורך. בדרך כלל משתמשים ב-onKeyUp() כדי לוודא שמתקבל רק אירוע אחד. אם המשתמש לוחץ על מקש ומחזיק אותו,
הפונקציה onKeyDown() נקראת כמה פעמים.
לדוגמה, ההטמעה הזו מגיבה לחלק ממקשי המקלדת כדי לשלוט במשחק:
Kotlin
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { return when (keyCode) { KeyEvent.KEYCODE_D -> { moveShip(MOVE_LEFT) true } KeyEvent.KEYCODE_F -> { moveShip(MOVE_RIGHT) true } KeyEvent.KEYCODE_J -> { fireMachineGun() true } KeyEvent.KEYCODE_K -> { fireMissile() true } else -> super.onKeyUp(keyCode, event) } }
Java
@Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_D: moveShip(MOVE_LEFT); return true; case KeyEvent.KEYCODE_F: moveShip(MOVE_RIGHT); return true; case KeyEvent.KEYCODE_J: fireMachineGun(); return true; case KeyEvent.KEYCODE_K: fireMissile(); return true; default: return super.onKeyUp(keyCode, event); } }
טיפול במקשי צירוף
כדי להגיב לאירועים של מקשי צירוף, למשל כשמשלבים מקש עם Shift או Control, אפשר לשלוח שאילתה אל KeyEvent שמועבר לשיטת הקריאה החוזרת. יש כמה שיטות שבהן אפשר לקבל מידע על מקשי צירוף, כמו getModifiers() ו-getMetaState().
עם זאת, הפתרון הפשוט ביותר הוא לבדוק אם מקש הצירוף המדויק שחשוב לכם נלחץ באמצעות שיטות כמו isShiftPressed()
ו-isCtrlPressed().
לדוגמה, הנה שוב ההטמעה של onKeyUp(), עם טיפול נוסף במקרים שבהם מחזיקים את המקש Shift יחד עם אחד המקשים:
Kotlin
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { return when (keyCode) { ... KeyEvent.KEYCODE_J -> { if (event.isShiftPressed) { fireLaser() } else { fireMachineGun() } true } KeyEvent.KEYCODE_K -> { if (event.isShiftPressed) { fireSeekingMissle() } else { fireMissile() } true } else -> super.onKeyUp(keyCode, event) } }
Java
@Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) { ... case KeyEvent.KEYCODE_J: if (event.isShiftPressed()) { fireLaser(); } else { fireMachineGun(); } return true; case KeyEvent.KEYCODE_K: if (event.isShiftPressed()) { fireSeekingMissle(); } else { fireMissile(); } return true; default: return super.onKeyUp(keyCode, event); } }
מקורות מידע נוספים
- כלי העזר למקשי הקיצור: מסך מערכת שמאפשר למשתמשים לחפש את מקשי הקיצור שהאפליקציה מציעה.