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

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

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

توجه: هنگام مدیریت رویدادهای صفحه‌کلید با کلاس 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 را که به روش برگشت به تماس ارسال می‌شود، پرس و جو کنید. چندین روش اطلاعاتی در مورد کلیدهای اصلاح کننده ارائه می دهند، مانند 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);
    }
}

منابع اضافی