2012-06-30 47 views
20

Tôi muốn nhấn phím bất kỳ của phím chức năng. Tôi không muốn có một EditView hoặc TextView trong Hoạt động của tôi, sự kiện phải được xử lý từ Chế độ xem mở rộng bên trong Hoạt động của tôi.Android - Nhận bấm phím trên bàn phím

Tôi chỉ cố gắng này:

1) Override phương pháp onKeyUp(int keyCode, KeyEvent event) Hoạt động. Điều này không làm việc với softkeybord nó chỉ bắt vài hardkeyboard.

2) Tạo OnKeyListener và đăng ký trong Chế độ xem của tôi có đăng ký và đang hoạt động OnTouchListener. Điều này không hoạt động chút nào với softkeyboar.

3) Ghi đè phương thức Xem onKeyUp(int keyCode, KeyEvent event). Điều này không làm việc ở tất cả niether nếu tôi đặt OnKeyListener của tôi cũng không nếu tôi không đặt nó.

4) Với đối tượng InputMethodManager Gọi phương thức showSoftInput và chuyển giao cho Chế độ xem của tôi. Điều này không làm việc không phải để nâng cao bàn phím, thực sự tôi phải gọi toggleSoftInput; cũng không để nắm bắt các sự kiện quan trọng.

Tôi đã thử nghiệm tất cả chỉ trong trình mô phỏng nhưng tôi nghĩ là đủ. Tại sao nó phức tạp như vậy có một sự kiện quan trọng đơn giản từ bàn phím?

+0

Và khi bạn đã kiểm tra mã nguồn đến các lớp học như 'EditText' và 'TextView', để xem cách họ xử lý nó, bạn đã học được những gì? – CommonsWare

+5

Nghiên cứu mã nguồn có thể giúp nhưng mất quá nhiều thời gian. – Bemipefe

Trả lời

31

Hãy thử sử dụng dispatchKeyEvent(KeyEvent event) trong bạn Activity

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    Log.i("key pressed", String.valueOf(event.getKeyCode())); 
    return super.dispatchKeyEvent(event); 
} 
+0

Nó hoạt động! Cảm ơn bạn rất nhiều vasart – Bemipefe

+0

Tuy nhiên có vấn đề với các nhân vật được lựa chọn bởi các popup xuất hiện trên báo chí dài. Ví dụ nếu tôi nhấn và giữ 'a' và tôi chọn 'à' cả getKeyCode và getUnicodeChar return 0 – Bemipefe

+0

Hãy xem phương thức 'getDeadChar()' trong lớp 'KeyEvent' – vasart

13

Với sự gợi ý của vasart tôi có thể nhận được sự kiện KeyPress. Để làm cho mã phím có thể in được, tôi đã sử dụng chức năng getUnicodeChar chuyển qua trạng thái nút meta, sau đó chỉ cần một diễn viên giải quyết vấn đề.

Đây là mã làm việc:

@Override 
public boolean dispatchKeyEvent(KeyEvent KEvent) 
{ 
    int keyaction = KEvent.getAction(); 

    if(keyaction == KeyEvent.ACTION_DOWN) 
    { 
     int keycode = KEvent.getKeyCode(); 
     int keyunicode = KEvent.getUnicodeChar(KEvent.getMetaState()); 
     char character = (char) keyunicode; 

     System.out.println("DEBUG MESSAGE KEY=" + character + " KEYCODE=" + keycode); 
    } 


    return super.dispatchKeyEvent(KEvent); 
} 

Tất nhiên công việc này chỉ với ký tự ASCII.

+0

Trong trường hợp của tôi, chế độ xem Bàn phím tùy chỉnh không phản hồi dispatchkeyEvent .. Tôi đã triển khai keyboardView và tôi muốn phát hiện tổ hợp các phím như ctrl + c, Ctrl + v như thế. Làm sao tôi có thể đạt được điều đó – Roster

0

Khi Bàn phím được mở trong hoạt động hoạt động của bạn thực sự trở nên foreground ... Tất cả TextArea hoặc Trường văn bản có cơ chế riêng của họ để có được keyPressed từ trên màn hình bàn phím ... nếu bạn muốn sử dụng onKeyDown() listner cho làm bàn phím ảo chắc chắn rằng bạn đặt trong AndroidManifest File trong hoạt động của bạn android: windowSoftInputMode = "stateAlwaysVisible" sau đó onkeyDown() sẽ làm việc nó đã làm việc cho tôi ...

1

Không có tùy chọn để xử lý các sự kiện nhấn phím trên bàn phím mềm (trên bàn phím ảo) chỉ từ bàn phím phần cứng.

để biết thêm chi tiết: Handling Keyboard Actions

Các vấn đề liên quan