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

تجربة طريقة Compose
‫Jetpack Compose هي مجموعة أدوات واجهة المستخدِم المقترَحة لنظام Android. كيفية التعامل مع إجراءات لوحة المفاتيح في Compose

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

مراجع إضافية