2012-03-08 20 views
5

Tôi có 3 thành phần EditText và tôi muốn chuyển từ trường này sang trường khác nếu có 4 ký tự trong đầu vào.Đếm ký tự với TextWatcher không thành công trên HTC longpress

tôi sử dụng một TextWatcher cho việc này:

getEditView(R.id.edit_code1).addTextChangedListener(new TextWatcher() { 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) {} 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

    @Override 
    public void afterTextChanged(Editable input) { 
     if(input.length() == 4){ 
      getEditView(R.id.edit_code2).requestFocus(); 
     } 
    } 
}); 

Các inputType cho EditText là "textCapCharacters"

Khi làm một nhấn và giữ trên một chìa khóa để có được một số, như đang nắm giữ R để có được một 4 , hầu hết các thiết bị sẽ không thêm chữ cái, cho đến khi người dùng ngừng giữ nút và sẽ kích hoạt afterTextChanged sau khi chọn chữ cái 4. Trên bàn phím HTC (Trong trường hợp này HTC Desire trên 2.3.5) đây không phải là trường hợp. Mặc dù người dùng vẫn đang giữ nút, R được thêm vào EditText và afterTextChanged được kích hoạt, và mã thực hiện công việc của nó và đặt trọng tâm vào trường tiếp theo.

Làm cách nào để ngăn chặn hành vi không mong muốn này? Xem onKeyDown/Up sẽ không hữu ích, bởi vì nó không đăng ký tổ hợp phím thông thường.

Trả lời

1

Thật không may đó là lỗi trong bàn phím HTC mà không có cách sửa chữa. Đây là một sự kiện trong IME, nó là không thể đánh chặn các sự kiện liên lạc hoặc các sự kiện quan trọng, vì vậy bạn có lẽ sẽ tốt hơn khi chỉ đơn giản là làm cho người dùng bỏ qua đầu vào tiếp theo thay vì bạn thực hiện nó cho họ.

Nếu điều đó quan trọng đối với bạn, bạn có thể triển khai loại bàn phím riêng của mình ở đó, chỉ với các phím bạn cần.

+0

Đó là điều tôi sợ, cảm ơn bạn, tôi sẽ rời khỏi lựa chọn cho khách hàng. Nó luôn luôn có thể trên bàn phím HTC để sử dụng đầu vào số thay vì một longpress anyway. – Jurriaanr

2
 getEditView(R.id.edit_code1).addTextChangedListener(new TextWatcher() { 
@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) {} 
    if(input.length() >3){ 
     getEditView(R.id.edit_code2).requestFocus(); 
@Override 
public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

@Override 
public void afterTextChanged(Editable input) { 

    } 
} 

});

+0

tất cả 3 trình xử lý sự kiện, onTextChanged, beforeTextChanged, afterTextChanged được kích hoạt ngay sau khi nhấn một phím, vì hơn một chữ được thêm vào văn bản. Vấn đề là việc thực hiện phần mềm bàn phím không chờ người dùng nhả phím và chọn một số, trước khi thêm nó và gọi tất cả người nghe sự kiện – Jurriaanr