رسیدگی به کنش‌های صفحه‌کلید

امتحان کردن روش Compose
Jetpack Compose جعبه‌ابزار واسط کاربر توصیه‌شده برای Android است. با نحوه مدیریت کردن کنش‌های صفحه‌کلید در Compose آشنا شوید.

وقتی کاربر روی نمای نوشتار قابل‌ویرایش، مثل عنصر EditText ، تمرکز می‌کند و صفحه‌کلید سخت‌افزاری به دستگاه متصل است، همه ورودی‌ها توسط سیستم مدیریت می‌شود. بااین‌حال، اگر می‌خواهید ورودی صفحه‌کلید را رهگیری کنید یا مستقیماً خودتان آن را مدیریت کنید، می‌توانید این کار را با پیاده‌سازی روش‌های فراخوانی از میانای KeyEvent.Callback، مانند onKeyDown() و onKeyMultiple()، انجام دهید.

هر دو کلاس Activity و View میانای KeyEvent.Callback را پیاده‌سازی می‌کنند، بنابراین شما معمولاً روش‌های callback را در افزونه خود از این کلاس‌ها، به‌طور مناسب، لغو می‌کنید.

توجه: هنگام مدیریت رویدادهای صفحه‌کلید با کلاس KeyEvent و میاناهای برنامه‌سازی کاربردی مرتبط، انتظار داشته باشید که رویدادهای صفحه‌کلید فقط از صفحه‌کلید سخت‌افزاری دریافت شوند. هرگز برای هیچ کلیدی در روش ورودی نرم‌افزاری (صفحه‌کلید مجازی) به دریافت رویدادهای کلید تکیه نکنید.

رسیدگی به رویدادهای کلید تکی

برای مدیریت فشار دادن کلید تکی، onKeyDown() یا onKeyUp() را به‌طور مناسب پیاده‌سازی کنید. معمولاً از onKeyUp() استفاده می‌کنید اگر می‌خواهید مطمئن شوید که فقط یک رویداد دریافت می‌کنید. اگر کاربر کلیدی را فشار دهد و نگه دارد، onKeyDown() چندین بار فراخوانی می‌شود.

برای مثال، این پیاده‌سازی به برخی‌از کلیدهای صفحه‌کلید برای کنترل بازی پاسخ می‌دهد:

کاتلین

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)
    }
}

جاوا

@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() دوباره با مدیریت اضافی برای زمانی که کلید تبدیل با یکی از کلیدها نگه داشته می‌شود، آورده شده است:

کاتلین

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)
    }
}

جاوا

@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);
    }
}

منابع بیشتر