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

عندما يركِّز المستخدم على طريقة عرض نصية قابلة للتعديل، مثل عنصر 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);
    }
}

مصادر إضافية