כשהמשתמש מתמקד בתצוגת טקסט שניתנת לעריכה, כמו אלמנט EditText
, ויש לו מקלדת חומרה מחוברת, המערכת מטפלת בכל הקלט. עם זאת, אם אתם רוצים ליירט את הקלט מהמקלדת או לטפל בו ישירות בעצמכם, תוכלו לעשות זאת על ידי הטמעת שיטות קריאה חוזרת מהממשק KeyEvent.Callback
, כמו onKeyDown()
ו-onKeyMultiple()
.
גם המחלקה Activity
וגם המחלקה View
מטמיעות את הממשק KeyEvent.Callback
, לכן בדרך כלל מבטלים את הגדרת ברירת המחדל של שיטות ה-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
שמוענק לשיטת ה-callback. יש כמה שיטות שמספקות מידע על מקשי שינוי, כמו 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); } }
מקורות מידע נוספים
- כלי העזר למקשי הקיצור: מסך מערכת שמאפשר למשתמשים לחפש את מקשי הקיצור שהאפליקציה מציעה.