2010-09-12 33 views
20

Tôi đã xác định trường EditText và tôi muốn được thông báo khi người dùng chỉnh sửa các trường đó. Vì vậy, tôi nghĩ: đơn giản - tôi thêm một OnKeyListener và vì vậy tôi đã làm. Nhưng mặc dù trường văn bản được chỉnh sửa (và thậm chí hiển thị văn bản đã nhập/sửa đổi) Tôi không nhận được bất kỳ cuộc gọi lại nào, tức là đầu ra LOG không hiển thị.Android: tại sao OnKeyListener của tôi() không được gọi?

TextView text = new TextView(this); 
    text.setText(...); 
    ... 
    text.setOnKeyListener(new OnKeyListener() 
    {       
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      TextView tv = (TextView)v; 
      CharSequence val = tv.getText(); 
      Log.v(TAG, "value: " + val); 
      // ... rest omitted for brevity 
     } 
    }); 

Bất kỳ ý tưởng nào, tại sao gọi lại đó không bao giờ được gọi?

Michael

PS .: Sigh! Android thực sự đầy những điều kỳ quặc! Dường như hầu như không có gì tôi chạm vào cho đến nay đã làm việc ngay lập tức như người ta mong đợi. Và - tin hay không - tôi có rất nhiều kinh nghiệm với GUI, đặc biệt. trong Java (AWT, Swing, SWT, bạn đặt tên cho nó ...) Nhưng Android là một con thú thực sự khó khăn!

+1

@Falmarri của tôi, có gì sai với điều đó? Về mặt khái niệm, getText trả về một chuỗi các ký tự, vì vậy không có gì sai khi xử lý việc lưu trữ giá trị trả về trong một biến có kiểu đó. Và bạn phải làm điều đó để sử dụng phương thức getText. Bạn không thể chỉ thay đổi phương thức onKey để lấy một TextView bởi vì nó ghi đè một phương thức trong OnKeyListener. (Có thể cho rằng, phải có một @Override trên nó, nhưng nó là khá rõ ràng trong trường hợp này.) – MatrixFrog

+1

@Falmari: bạn rõ ràng đã không được lập trình cho Android. Tôi cũng sẽ perfer Strings nhưng alas Android trả về CharSequence của tất cả các nơi thay vì Strings, vì vậy bạn phải làm phôi hoặc toString() s thường xuyên. Và nếu một tiêu đề phương pháp chỉ định nghĩa một "Xem" nhưng bạn biết đó là một TextView và yo cần một trong những phương pháp mà chỉ TextView cung cấp, sau đó những gì khác bạn có thể làm gì? Bạn có đề xuất tốt hơn? – mmo

Trả lời

18

Bạn có sử dụng bàn phím mềm (ime) để nhập văn bản chỉnh sửa không? Tôi tin rằng onKeyListener chỉ được gọi với các sự kiện từ bàn phím phần cứng. Bạn nên sử dụng TextWatcher nếu có thể. onKeyListener not working with soft keyboard (Android)

+0

Tôi đọc qua phần phụ được tham chiếu và đó thực sự có thể là vấn đề. Tất nhiên tôi chưa bao giờ thử với một bàn phím thực (vì thiết bị của tôi không có bất kỳ ...) và bàn phím giả lập dường như không kích hoạt các sự kiện như vậy. Tôi đã thay đổi thành TextWatcher như đã đề xuất và mẹo đó thực hiện! Cảm ơn! – mmo

1

Bạn nói rằng bạn đang xử lý một EditText, nhưng mã của bạn đề cập đến một TextView. Đoán của tôi là bạn có một EditText trong các tệp XML bố trí của mình, nhưng bạn đang đề cập đến TextView mới được tạo này trong mã của bạn, thực tế là ngay cả trong giao diện người dùng của ứng dụng.

Nếu đã có EditText trong tệp XML bố cục của bạn, thì bạn cần có một con trỏ đến nó trong mã Java của bạn, có thể sử dụng phương thức findViewById(). Sau đó, thêm OnKeyListener của bạn vào EditText đó.

Xác định bố cục của bạn trong XML thực sự có ý nghĩa hơn (ít nhất trong nhiều trường hợp, nếu không phải là nhiều nhất) xác định thành phần đó tại một thời điểm và sau đó thêm từng thành phần đó vào giao diện người dùng, như bạn làm trong Swing . Nhưng phải mất một số nhận được sử dụng để, không có câu hỏi.

+0

bạn là đúng - TextView là trong thực tế một EditText và không được tạo ra bởi "mới" nhưng sử dụng một inflater. Tôi đã thay đổi điều đó ở đây một cách ngắn gọn. Nhưng tôi vẫn không nhận được bất kỳ onKey() - callbacks ... – mmo

+0

Tôi có thể sai, nhưng tôi không nghĩ rằng bạn muốn sử dụng một inflater ở đây. Chỉ cần làm 'setContentView' và nó làm tăng thêm cho bạn. Tôi đoán là cùng một XML được tăng gấp đôi hai lần - một lần thông qua 'setContentView' và một lần thông qua' LayoutInflater'.Vì vậy, bạn có hai bản sao của cùng một bố cục và người nghe đang được thêm vào sai. – MatrixFrog

+0

Không, vấn đề không phải là có hai bản sao. Tôi thậm chí còn xóa tất cả trẻ em một cách rõ ràng trước khi bắt đầu thêm những con của riêng tôi. Vấn đề có vẻ là hiệu ứng dưới đây - xem phần phụ của Mayra. – mmo

7

Tôi gặp vấn đề tương tự nhưng chỉ trên 1 trong số các ứng dụng Android của tôi và tôi chưa bao giờ tìm ra sự khác biệt là gì.

Giải pháp của tôi là làm những gì Mayra đề xuất và thêm Trình soạn thảo để xử lý các sự kiện TextChanged. Vì vậy, nó hoạt động không có vấn đề làm thế nào các mục nhập văn bản xảy ra.

editName.addTextChangedListener(new TextWatcher() { 
     public void afterTextChanged(Editable s) { 
      Button btnSave = (Button)findViewById(R.id.btnSaveToon); 
      if(s.length() > 0) 
       btnSave.setEnabled(true); 
      else 
       btnSave.setEnabled(false); 
     } 

     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      // TODO Auto-generated method stub 
     } 

     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      // TODO Auto-generated method stub 
     } 

    }); 

trình như một nét duyên dáng trong bộ mô phỏng và trên HTC Inspire

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