2012-02-27 20 views
5

Tôi cần phát hiện các thay đổi văn bản trong EditText. Tôi đã thử TextWatcher, nhưng nó không hoạt động theo cách tôi mong đợi. Lấy phương pháp OnTextChanged:Phát hiện các thay đổi trong EditText (TextWatcher không hiệu quả)

public void onTextChanged(CharSequence s, int start, int before, int count)

Nói rằng tôi có dòng chữ "John" trong đã có trong EditText. Nếu nhấn một phím khác, "e", s sẽ là "Johne", start sẽ là 0, before sẽ là 4 và count sẽ là 5. Cách tôi mong đợi phương pháp này hoạt động sẽ là sự khác biệt giữa những gì EditText trước đây và những gì sắp trở thành.

Vì vậy, tôi mong chờ:

s = "Johne" 
start = 4 // inserting character at index = 4 
before = 0 // adding a character, so there was nothing there before 
count = 1 // inserting one character 

tôi cần để có thể phát hiện những thay đổi cá nhân mỗi khi một phím được nhấn. Vì vậy, nếu tôi có văn bản "John", tôi cần phải biết "e" đã được thêm vào chỉ mục 4. Nếu tôi backspace "e", tôi cần phải biết "e" đã bị xóa khỏi chỉ mục 4. Nếu tôi đặt con trỏ sau "J "và backspace, tôi cần biết" J "đã bị xóa khỏi chỉ mục 0. Nếu tôi đặt" G "trong đó" J "là, tôi muốn biết" G "được thay thế" J "tại chỉ mục 0.

Cách tôi có thể đạt được điều này? Tôi không thể nghĩ ra một cách đáng tin cậy để làm điều này.

+0

thử onKeyListener cho EditText –

+0

gì về dán từ clipboard? –

+0

Một vấn đề khác mà tôi gặp phải là nói rằng tôi có một phạm vi văn bản được chọn. Trong bất kỳ phương thức nào của TextWatcher, getSelectionStart và End luôn là cùng một chỉ mục, bất kể tôi có văn bản được chọn hay không. –

Trả lời

9

Sử dụng trình xem văn bản và tự làm khác. lưu trữ văn bản trước đó bên trong trình xem và sau đó so sánh văn bản trước đó với bất kỳ chuỗi nào bạn nhận được onTextChanged. Vì onTextChanged được kích hoạt sau mỗi ký tự, bạn biết văn bản trước đó của bạn và văn bản đã cho sẽ khác nhau tối đa một chữ cái, điều này sẽ giúp bạn dễ dàng tìm ra thư đã được thêm vào hoặc xóa ở đâu. tức là:

new TextWatcher(){ 
    String previousText = theEditText.getText(); 

    @Override 
    onTextChanged(CharSequence s, int start, int before, int count){ 
     compare(s, previousText); //compare and do whatever you need to do 
     previousText = s; 
    } 

    ... 
} 
+0

Đó là một gợi ý mà tôi đã nghĩ đến, và chắc chắn là khả thi, nhưng tôi đã hy vọng một cách dễ dàng "ở đây bạn đi!" phương pháp, có thể không tồn tại. Vấn đề duy nhất với cách tiếp cận của bạn là văn bản có thể khác nhau hơn 1 chữ cái (phạm vi lựa chọn, dán từ clipboard). –

+1

Đúng nhưng tại thời điểm đó chỉ số có ít ý nghĩa (điều gì sẽ xảy ra nếu bạn dán một từ trước văn bản hiện tại chẳng hạn?) Và thậm chí sau đó bạn vẫn có thể tự làm khác. Tôi không nghĩ có bất kỳ giải pháp tích hợp nào cho những gì bạn đang cố gắng làm. –

+0

Đủ công bằng. Tôi đã kết thúc làm những gì bạn nói và về cơ bản đã triển khai TextWatcher của riêng tôi và chuyển các giá trị mà tôi mong đợi. Nó không phải là bằng chứng đánh lừa 100% nhưng nó khá gần. –

0

Bạn cần lưu trữ và cập nhật CharSequence trước mỗi lần văn bản được thay đổi. Bạn có thể làm như vậy bằng cách triển khai TextWatcher.

Ví dụ:

final CharSequence[] previousText = {""}; 
editText.addTextChangedListener(new TextWatcher() 
{ 
    @Override 
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) 
    { 
    } 

    @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) 
    { 
     if(i1 > 0) 
     { 
      System.out.println("Removed Chars Positions & Text:"); 
      for(int index = 0; index < i1; index++) 
      { 
       System.out.print((i + index) + " : " + previousText[0].charAt(i + index)+", "); 
      } 
     } 
     if(i2 > 0) 
     { 
      System.out.println("Inserted Chars Positions & Text:"); 
      for(int index = 0; index < i2; index++) 
      { 
       System.out.print((index + i) + " : " + charSequence.charAt(i + index)+", "); 
      } 
      System.out.print("\n"); 
     } 
     previousText[0] = charSequence.toString();//update reference 
    } 

    @Override public void afterTextChanged(Editable editable) 
    { 
    } 
}); 
Các vấn đề liên quan