2009-12-28 43 views
16

Tôi đang sử dụng onKeyListener để nhận các sự kiện onKey. Nó hoạt động tốt với bàn phím thông thường. Nhưng nó không hoạt động với bàn phím mềm. Tôi chỉ có thể nhận các sự kiện onKey cho số học chứ không phải bảng chữ cái. Có giải pháp nào để giải quyết vấn đề này không? Bất kỳ loại trợ giúp nào cũng sẽ được đánh giá cao.onKeyListener không hoạt động với bàn phím mềm (Android)

+0

Nghe có vẻ kỳ quặc nếu bạn đang nhận được một số nhân vật nhưng không phải người khác từ bàn phím mềm. Bạn có thể đăng mã của người nghe của mình và nơi bạn đính kèm nó không? –

+0

void công cộng onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.login_screen); emailTxt = (EditText) findViewById (R.id.email); emailTxt.setOnKeyListener (OnKeyListener mới() \t { \t \t public boolean onKey (Xem v, int keyCode, KeyEvent sự kiện) \t \t { \t \t \t Log.i ("Key Value", String. valueOf (mã khóa)); \t \t}); } –

+0

Tôi chỉ đọc các phím cho bây giờ. –

Trả lời

10

Tôi không tin rằng OnKeyListener được gọi một cách hoàn toàn bằng bàn phím phần mềm. Nó có một cái gì đó để làm với bàn phím phần mềm là một thiết bị IME và các thiết bị IME có thể là những thứ khác ngoài bàn phím. Nó dường như làm cho onKeyListener khá nhiều vô dụng mặc dù, vì nó chỉ hoạt động trên điện thoại với bàn phím phần cứng. Gần đây tôi đã khắc phục vấn đề này bằng cách sử dụng TextWatcher trên trường EditText trong Hoạt động của tôi thay vì sử dụng OnKeyListener.

+0

Tôi đã thử sử dụng TextWatcher nhưng tôi cần các sự kiện KeyUp và KeyDown cho mỗi phím được nhấn. Textwatcher chỉ mang lại cho tôi sự kiện keydown. –

+0

Tôi không nghĩ rằng có thể nghe KeyUp và KeyDown từ bàn phím phần mềm. –

7

onKeyListener làm việc một cách hoàn hảo trên Android 1.5 thông qua bàn phím mềm

Từ Android 1.6 trở đi các phím ký tự và số sẽ không thông qua sự kiện onKey, nhưng phím DEL làm

Bực bội

3

này dường như là thiết bị cụ thể. Tôi có thể xác nhận rằng nó hoạt động trên Xoom và Acer A100. Tuy nhiên, Samsung Galaxy Tab Plus chỉ kích hoạt sự kiện cho các nút không phải nhân vật. (Tất cả các thiết bị chạy Honeycomb)

1

Tôi nhận được điều này bằng cách đặt người nghe vào phương pháp riêng của nó và gọi lại lần nữa sau lần đầu tiên. Trong onCreate tôi gọi setKeyListenerForEnter();

Sau đó, đây là phương pháp:

public void setKeyListenerForEnter() {

final EditText search_entry = (EditText) findViewById(R.id.search_entry); 
    search_entry.setOnKeyListener(new OnKeyListener() { 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      // If the event is a key-down event on the "enter" button 
      if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
       (keyCode == KeyEvent.KEYCODE_ENTER)) { 
       getSearchResults(v); 
       setKeyListenerForEnter(); 
       return true; 
      } 
      return false; 
     } 
    }); 
} 

Tôi không chắc chắn nếu điều này là một giải pháp tốt hơn so với xử lý bàn phím IME chính nó, nhưng nó là một giải pháp .

4

Điều này có lẽ là ngu ngốc, nhưng đó là cách Android hoạt động vào lúc này.

Tài liệu nêu rõ rằng các sự kiện chính sẽ chỉ được truyền cho các nét chính của phần cứng chứ không phải phần mềm.

Các nhà sản xuất thiết bị thực sự không được khuyến khích tuyên truyền các sự kiện bàn phím mềm thông qua người nghe chính, mặc dù hoàn toàn phụ thuộc vào nhà sản xuất để tôn trọng hoặc thực sự xử lý bàn phím mềm và cứng với điều kiện như nhau.

Bắt đầu từ Android 4.2.2, bản thân hệ thống Android sẽ không hỗ trợ các sự kiện nhấn phím cho bàn phím mềm, vì vậy ngay cả các nhà sản xuất cũng sẽ không thể lựa chọn.

Vì vậy, tùy chọn đơn giản chỉ có thể thực hiện IME của riêng bạn (bàn phím mềm) và tự xử lý các thao tác gõ phím.

Trình soạn thảo văn bản có thể được sử dụng chủ yếu để thay thế trình nghe chính, tuy nhiên editText.setText (...); cũng sẽ kích hoạt các sự kiện TextWatcher, vì vậy nếu một trong những quan tâm đến các phím gõ chỉ sau đó có lẽ TextWatcher không phải là một giải pháp, hoặc.

Hãy thận trọng khi sử dụng TextWatcher với AutocomleteTextView hoặc EditText. Không sửa đổi văn bản trong nội dung của AutocompleteTextView/EditText từ bên trong các sự kiện TextWatcher, nếu không bạn có thể sẽ kết thúc trong một vòng lặp sự kiện/nghe vô hạn.

Hy vọng điều này sẽ giúp làm rõ các tùy chọn có sẵn, nhưng thật đáng tiếc là nó không cung cấp giải pháp làm việc.

Thất vọng rằng Google đã bỏ lỡ khía cạnh quan trọng này của giao diện người dùng của họ.

-1
setFocusableInTouchMode(true); //Enable soft keyboard on touch for target view 

setFocusable(true); //Enable hard keyboard to target view 

dụ:

public class CanvasView extends View{ 
    public CanvasView(Context c){ 
     super(c); 

     //enable keyboard 
     setOnKeyListener(new KeyBoard()); 
     setFocusable(true); 
     setFocusableInTouchMode(true); 
    } 
} 
+0

Bạn có thể cho chúng tôi ví dụ về cách người ta có thể sử dụng mã này không? Tôi đã thử nó bây giờ và nó dường như không hoạt động. – Simon

+0

public class CanvasView kéo dài Xem { \t \t CanvasView công cộng (Context c) { \t \t siêu (c); \t \t \t \t // cho phép bàn phím \t \t setOnKeyListener (bàn phím mới()); \t \t setFocusable (true); \t \t setFocusableInTouchMode (true); \t}} // bật bàn phím để canvasView – user3309567

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