التعامل مع إجراءات لوحة المفاتيح

عندما يوجّه المستخدم التركيز إلى عرض نص قابل للتعديل، مثل عنصر EditText ، وكان لديه لوحة مفاتيح حقيقية متصلة، يعالج النظام كل الإدخال. ومع ذلك، إذا كنت تريد اعتراض أو معالجة إدخال لوحة المفاتيح بنفسك مباشرةً، يمكنك إجراء ذلك من خلال تنفيذ طرق الاستدعاء من واجهة KeyEvent.Callback ، مثل onKeyDown() وonKeyMultiple().

تُنفِّذ كلتا الفئتَين Activity وView واجهة KeyEvent.Callback، لذا يمكنك بشكل عام إلغاء طرق الاستدعاء في إضافة هاتين الفئتَين، كما هو مناسب.

ملاحظة: عند التعامل مع أحداث لوحة المفاتيح باستخدام الفئة KeyEvent وواجهات برمجة التطبيقات ذات الصلة، يمكنك توقُّع أنّ مصدر أحداث لوحة المفاتيح هو لوحة مفاتيح خارجية فقط. لا تعتمد أبدًا على تلقّي أحداث المفاتيح لأي مفتاح في أسلوب إدخال برمجي (لوحة مفاتيح على الشاشة).

التعامل مع الأحداث الرئيسية الفردية

لمعالجة الضغط على مفتاح فردي، نفِّذ 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);
    }
}

مصادر إضافية