2010-11-26 46 views
21

Tôi không hiểu tại sao đoạn mã này không hoạt động. Chỉ phát hiện phím backspace và return. Trình nghe không kích hoạt bất kỳ khóa nào khác. Thiết bị của tôi là Nexus One.onKeyListener không hoạt động trên bàn phím ảo

Tôi đã cố gắng ghi đè phương thức OnKeyDown của hoạt động và thậm chí còn tồi tệ hơn. Nút phát hiện duy nhất là nút quay lại phần cứng.

Tôi đang thấy xung quanh một đề nghị để sử dụng TextWatcher và onTextChanged, trong khi đó có thể làm việc trong một số trường hợp, nó không phải là một công việc thực sự xung quanh. Ví dụ: nếu hộp văn bản trống, bạn sẽ không phát hiện nếu người dùng nhấn nút BackSpace (Xóa). Vì vậy, bất kỳ ý tưởng?

 TextView txtInput = (TextView)findViewById(R.id.txtInput); 
    txtInput.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      makeToast(keyCode + " key pressed"); 
      return true; 
     } 
    }); 
+0

Vâng, tôi đã dành 4 giờ cho vấn đề này. Có vẻ như không ai có giải pháp cho việc này. Rất ít người cũng đề xuất sử dụng OnKeyboardActionListener, nhưng không thể tìm thấy bất kỳ ví dụ nào về cách sử dụng nó. – bobetko

+0

Tìm thấy ví dụ tại đây: http://developer.android.com/resources/samples/SoftKeyboard/src/com/example/android/softkeyboard/SoftKeyboard.html – bobetko

+0

Tôi không chắc chắn rằng ví dụ về softkeyboard sẽ hoạt động đối với tôi. Tôi sẽ không viết phương thức nhập khác. Tôi chỉ muốn hiển thị phương thức nhập mặc định trên màn hình (bàn phím android thường) và chụp bất kỳ phím bấm nào. Tại sao điều này có vẻ khó khăn như vậy? Tôi cảm thấy thất vọng. – bobetko

Trả lời

18

Ok. Cuối cùng tôi đã tìm ra cách để làm những gì tôi muốn, và tôi không tự hào về Android vì điều này.

Tôi đang viết ứng dụng máy khách/ứng dụng khách khi tôi phải mở SoftKeyboard và gửi các phím bấm (ký tự và phím DEL) ... Mỗi lần bấm phím, ký tự đó sẽ được gửi đến máy chủ. Nếu DEL được nhấn, tôi đang gửi chuỗi {BS} đến máy chủ.

Để thực hiện điều đó, tôi phải triển khai TextWatcher và onTextChange hoạt động tốt ngoại trừ trường hợp EditText bị trống và người dùng nhấn phím DEL. Vì không có thay đổi trong EditText nên không có cách nào để phát hiện rằng phím DEL được nhấn.

Ngoài TextWatcher, tôi đã phải triển khai onKeyListener mà tôi đã gắn vào điều khiển EditText của mình. Điều này onKeyListener bỏ qua tất cả các phím trên SoftKeyboard ngoại trừ DEL và RETURN. Không chắc chắn lý do tại sao? Một lỗi có thể?

Đây là mã của tôi:

TextView txtInput = (TextView)findViewById(R.id.txtInput); 
    txtInput.addTextChangedListener(inputTextWatcher); 

    txtInput.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      Log.d(TAG, keyCode + " character(code) to send"); 
      return false; 
     } 
    }); 

và TextWatcher ....

private TextWatcher inputTextWatcher = new TextWatcher() { 
    public void afterTextChanged(Editable s) { } 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) 
     { } 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     Log.d(TAG, s.charAt(count-1) + " character to send");;   
    } 
}; 
+0

Nó thực sự gây khó chịu rằng một số bàn phím dường như không gửi mã khóa onkeyup (ví dụ: bàn phím mặc định samsung trên S3/S4). Bạn phải làm việc xung quanh nó bằng cách xem cho văn bản thay đổi thay vì ... – kenyee

+1

những gì về khi không có nhân vật và người sử dụng bấm phím trở lại? – Arslan

4

Bạn đã phạm một sai lầm ở đây.
cần return true, Nếu bạn xử lý sự kiện. Nếu bạn muốn cho phép sự kiện này được xử lý bởi các máy thu tiếp theo, return false
Bạn luôn trở về đúng

+0

Cảm ơn bạn đã làm rõ điều đó. Tôi thực sự đã cố gắng trả về sai. Đọc xung quanh tôi đã tìm tôi phải sử dụng onKeyboardActionListener. Sẽ dành một chút thời gian vào ngày mai. Cám ơn. – bobetko

0

Chúng tôi đã vấn đề TextWatcher trên iPhone cũng - nếu đệm trống, bàn phím không gửi del biến cố. Chúng tôi đã làm việc xung quanh nó bằng cách tải trước bộ đệm bàn phím với 1000 ký tự. May mắn thay, ứng dụng của chúng tôi đã ẩn trường chỉnh sửa phía sau bàn phím để 1000 ký tự không được nhìn thấy. Nó xấu xí, nhưng nó hoạt động (trừ khi người dùng truy cập 1000 lần xóa trong một hàng trước khi nhập bất kỳ dữ liệu nào!)

2

Bạn đã thử sử dụng lớp phụ người nghe cụ thể cho chế độ xem đó chưa?

Tôi gặp sự cố tương tự với EditText. Mã bên dưới hoạt động:

private OnKeyListener keyListener = new EditText.OnKeyListener(){ 

    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     EditText et = (EditText) v; 
     Log.i("APPEVENT", "Key hit: "+ event); 
     //... 
     return false; 
    } 

}; 

Nhưng nếu tôi sử dụng View.OnKeyListener, tôi chỉ ghi lại không gian và nhập. Nó có thể là một vấn đề tương tự với TextView. Có lẽ các trình lắng nghe khóa lớp con nhạy cảm với nhiều sự kiện hơn cho lớp con View đã cho.

3

Lưu ý: inputtype đề cập đến trong văn bản của bạn.

<EditText android:id="@+id/select_category" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:inputType="textCapSentences|textAutoCorrect" > 



edittext.setOnEditorActionListener(new OnEditorActionListener() { 

      @Override 
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 

       if ((actionId & EditorInfo.IME_MASK_ACTION) == EditorInfo.IME_ACTION_DONE) { 
        //do something here. 
        return true; 
       } 
       return false; 
      } 
     }); 
+0

điều này giải quyết được vấn đề của tôi với bàn phím Mimuum. Nó hoạt động mà không có imeOptions như trong mã của bạn? – Goufalite

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