2012-06-21 35 views
79

Tôi biết một chút về TextWatcher nhưng sẽ kích hoạt trên mọi ký tự bạn nhập. Tôi muốn người nghe kích hoạt bất cứ khi nào người dùng hoàn tất chỉnh sửa. Có thể không? Cũng trong số TextWatcher Tôi nhận được một phiên bản của Editable nhưng tôi cần một phiên bản của EditText. Làm thế nào để có được điều đó?android edittext onchange listener

EDIT: câu hỏi thứ hai quan trọng hơn. Xin hãy trả lời.

+1

để thêm người nghe tập trung, khi EditText mất tập trung , điều đó có nghĩa là người dùng đã bắt đầu chỉnh sửa nó và khi editText mất tiêu điểm, điều đó có nghĩa là việc chỉnh sửa hoàn tất – Houcine

+0

https://github.com/henrychuangtw/AutoInsertEditText – HenryChuang

Trả lời

156

trước tiên, bạn có thể xem liệu người dùng có hoàn thành chỉnh sửa văn bản hay không nếu người dùng nhấn nút xong (tùy thuộc vào việc triển khai của bạn và điều gì phù hợp nhất với bạn). Thứ hai, bạn không thể nhận được cá thể EditText trong trình soạn thảo văn bản chỉ khi bạn đã khai báo EditText làm đối tượng mẫu. Mặc dù bạn không nên chỉnh sửa EditText trong phạm vi textwatcher vì nó không an toàn.

EDIT:

Để có thể có được dụ EditText vào thực hiện TextWatcher của bạn, bạn nên thử một cái gì đó như thế này:

public class YourClass extends Activity { 

private EditText yourEditText; 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 
     yourEditText = (EditText) findViewById(R.id.yourEditTextId); 

     yourEditText.addTextChangedListener(new TextWatcher() { 

      public void afterTextChanged(Editable s) { 

      // you can call or do what you want with your EditText here 
      yourEditText. ... 

      } 

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

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

} 

Lưu ý rằng ví dụ trên có thể có một số lỗi nhưng tôi chỉ muốn cho bạn thấy một ví dụ.

1

Theo như tôi có thể nghĩ rằng bout nó, chỉ có hai cách bạn có thể làm điều đó. Làm thế nào bạn có thể biết người dùng đã viết xong một từ? Hoặc là tập trung bị mất hoặc nhấp vào nút "ok". Không có cách nào trong tâm trí của tôi bạn có thể biết người dùng nhấn ký tự cuối cùng ...

Vì vậy, hãy gọi onFocusChange(View v, boolean hasFocus) hoặc thêm nút và trình nghe nhấp chuột vào nó.

2

TextWatcher không hoạt động đối với tôi vì nó tiếp tục kích hoạt cho mọi EditText và làm rối tung lên các giá trị khác.

Đây là giải pháp của tôi:

public class ConsultantTSView extends Activity { 
    ..... 

    //Submit is called when I push submit button. 
    //I wanted to retrieve all EditText(tsHours) values in my HoursList 

    public void submit(View view){ 

     ListView TSDateListView = (ListView) findViewById(R.id.hoursList); 
     String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString(); 
    } 
} 

Do đó bằng cách sử dụng phương pháp getChildAt(xx) bạn có thể lấy bất kỳ mục trong ListView và nhận được hàng cá nhân sử dụng findViewById. Và sau đó nó sẽ đưa ra giá trị gần đây nhất.

4

Tôi đã làm nó bằng cách sử AutotextView:

AutotextView textView = (AutotextView) findViewById(R.id.autotextview); 
textView.addTextChangedListener(new TextWatcher() { 

    @Override 
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
     seq = cs; 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) { 

    } 

    @Override 
    public void afterTextChanged(Editable arg0) { 
     new SearchTask().execute(seq.toString().trim()); 
    } 

}); 
8

Bất cứ ai sử dụng ButterKnife. Bạn có thể sử dụng như:

@OnTextChanged(R.id.zip_code) 
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) { 

} 
7

Nó được làm phiền tôi rằng thực hiện một người biết lắng nghe cho tất cả các lĩnh vực EditText của tôi đòi hỏi tôi phải có xấu xí, mã verbose vì vậy tôi đã viết lớp bên dưới. Có thể hữu ích cho bất cứ ai ngại về điều này.

public abstract class TextChangedListener<T> implements TextWatcher { 
    private T target; 

    public TextChangedListener(T target) { 
     this.target = target; 
    } 

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

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) {} 

    @Override 
    public void afterTextChanged(Editable s) { 
     this.onTextChanged(target, s); 
    } 

    public abstract void onTextChanged(T target, Editable s); 
} 

Bây giờ, việc triển khai trình nghe sẽ sạch hơn một chút.

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) { 
      @Override 
      public void onTextChanged(EditText target, Editable s) { 
       //Do stuff 
      } 
     }); 

Đối với nó cháy mức độ thường xuyên, một có lẽ có thể thực hiện một kiểm tra để chạy mã của họ mong muốn trong //Do stuff sau một cho một thử

2
myTextBox.addTextChangedListener(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) { 

    TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox); 
    myOutputBox.setText(s); 

    } 
}); 
+2

Có một điều không cần thiết} ở cuối – Howard