ביצוע פעולות במקלדת

כשהמשתמש מתמקד בתצוגת טקסט שניתנת לעריכה, כמו אלמנט EditText, ויש לו מקלדת חומרה מחוברת, כל הקלט מטופל על ידי המערכת. עם זאת, אם אתם רוצים ליירט את הקלט מהמקלדת או לטפל בו ישירות בעצמכם, תוכלו לעשות זאת על ידי הטמעת שיטות קריאה חוזרת מהממשק KeyEvent.Callback, כמו onKeyDown() ו-onKeyMultiple().

גם המחלקה Activity וגם המחלקה View מטמיעות את הממשק KeyEvent.Callback, לכן בדרך כלל מבטלים את הגדרת ברירת המחדל של שיטות ה-callback בתוסף של המחלקות האלה, לפי הצורך.

הערה: כשמטפלים באירועי מקלדת באמצעות הכיתה KeyEvent וממשקי ה-API הקשורים, צריך לצפות שאירועי המקלדת מגיעים רק ממקלדת חומרה. אף פעם אל תסתמכו על קבלת אירועים מרכזיים עבור מקש כלשהו בשיטת קלט Soft (מקלדת שמופיעה במסך).

טיפול באירועי מפתח יחיד

כדי לטפל בהקשה על מקש ספציפי, מטמיעים את 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);
    }
}

מקורות מידע נוספים