จัดการการดำเนินการของแป้นพิมพ์

ลองใช้วิธีแบบ Compose
Jetpack Compose เป็นชุดเครื่องมือ UI ที่แนะนำสำหรับ Android ดูวิธีจัดการการดำเนินการของแป้นพิมพ์ในฟีเจอร์เขียน

เมื่อผู้ใช้โฟกัสที่มุมมองข้อความที่แก้ไขได้ เช่น องค์ประกอบ EditText และผู้ใช้มีแป้นพิมพ์ฮาร์ดแวร์ที่เชื่อมต่ออยู่ ระบบจะจัดการอินพุตทั้งหมด อย่างไรก็ตาม หากต้องการสกัดกั้น หรือจัดการอินพุตจากแป้นพิมพ์ด้วยตนเองโดยตรง คุณสามารถทำได้โดยการใช้เมธอดเรียกกลับ จากอินเทอร์เฟซ KeyEvent.Callback เช่น onKeyDown() และ onKeyMultiple()

ทั้งคลาส Activity และ View ใช้การติดตั้งใช้งานอินเทอร์เฟซ KeyEvent.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 ที่ส่งไปยังเมธอดเรียกกลับได้ มีหลายวิธี ที่ให้ข้อมูลเกี่ยวกับแป้นกดร่วม เช่น 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);
    }
}

แหล่งข้อมูลเพิ่มเติม