عملکردهای صفحه کلید را مدیریت کنید

روش نوشتن را امتحان کنید
Jetpack Compose ابزار رابط کاربری پیشنهادی برای اندروید است. یاد بگیرید که چگونه عملکردهای صفحه کلید را در Compose مدیریت کنید.

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

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

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

مدیریت رویدادهای تک کلیدی

برای مدیریت فشردن یک کلید به صورت جداگانه، 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 را که به متد callback ارسال می‌شود، جستجو کنید. چندین روش اطلاعاتی در مورد کلیدهای اصلاح‌کننده ارائه می‌دهند، مانند getModifiers() و getMetaState() . با این حال، ساده‌ترین راه حل این است که بررسی کنید آیا کلید اصلاح‌کننده‌ای که دقیقاً برای شما مهم است با روش‌هایی مانند isShiftPressed() و isCtrlPressed() فشرده می‌شود یا خیر.

برای مثال، در اینجا دوباره پیاده‌سازی onKeyUp() آمده است، با مدیریت اضافی برای زمانی که کلید Shift با یکی از کلیدها نگه داشته می‌شود:

کاتلین

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

منابع اضافی