2011-03-01 28 views
5

vào hoạt động trên Android, trước tiên tôi sẽ khôi phục văn bản trong EditText và thêm sau đó, một TextWatcher vào đó.TextWatcher được gọi ngay cả khi văn bản được đặt trước khi thêm người theo dõi

private static int WC = 0; 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
Log.e("TextWatcherTest", "onCreate:\t" +CLASS_NAME); 
setContentView(R.layout.main); 

EditText et = (EditText)findViewById(R.id.editText); 
Log.e("TextWatcherTest", "Set text xyz"); 
et.setText("xyz"); 

et.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 s) { 
     Log.e("TextWatcherTest", "afterTextChanged:\t" +s.toString()); 
    } 
}); 
} 

nhưng khi tôi chạy hoạt động, phương thức afterTextChanged được gọi ngay cả khi chính Người theo dõi được thêm sau khi đặt văn bản. vì vậy các dữ liệu ghi nhận là một cái gì đó giống như

 
onCreate: LifecycleMain 
Set text xyz 
// screen rotation 
onCreate: LifecycleMain 
Set text xyz 
afterTextChanged: xyz 2 

quầy trong TextWatcher cho thấy rằng người quan sát đó được gọi là là một trong đó đã được bổ sung sau khi văn bản đã được thiết lập trong EditText. bất kỳ ý tưởng tại sao điều đó xảy ra và làm thế nào tôi có thể ngăn chặn điều đó?

Trả lời

1

Điều này chắc chắn phải xảy ra. Bạn đang thiết lập văn bản khi savedinstanceState không phải là null (nghĩa là các trạng thái đối tượng trước đó của bạn được lưu). Tôi nghĩ rằng điều này xảy ra bởi vì bạn đã thêm TextWatcher vào EditText của mình trong phương thức onCreate và lần sau onCreate được gọi (ví dụ: sau khi thay đổi cấu hình) thì nó thấy rằng TextWatcher đã được thêm vào EditText.

Nếu bạn muốn kiểm tra tình hình này, đặt điều này trước khi tình trạng của bạn:

if(savedInstanceState == null){ 
    Log.e("savedInstance state is null", "no text"); 
    et.setText("No text"); 
} 

Trong trường hợp này, nếu bạn gọi setText trên EditText của bạn, sau đó afterTextChanged (Editable s) sẽ không được gọi.

+0

không thực sự. nó thực sự đúng là nó hoạt động lần đầu tiên hoạt động được tạo ra, nhưng EditText là mỗi lần một cá thể mới mà không có bất kỳ người xem nào gắn liền với nó. tôi đã đơn giản hóa mã và thêm một bộ đếm cho trình theo dõi: – SimonSays

+0

có u được định nghĩa editText et là tĩnh không? nếu có thì đây có thể là lý do. và như bạn đề cập đến nó hoạt động f9 lần đầu tiên, sau đó các prob chắc chắn rằng trường hợp mới của ediText là không nhận được tạo ra mỗi lần –

+0

xin lỗi, nó cập nhật bình luận của tôi trước khi tôi hoàn thành nó. tôi đã cập nhật mã ở trên ngay bây giờ. tôi đã đơn giản hóa nó và thêm một bộ đếm cho TextWatcher. những gì bạn có thể thấy là vấn đề không xuất hiện lần đầu tiên hoạt động được tạo ra, nhưng lần thứ hai. NHƯNG, phiên bản TextWatcher thứ hai được gọi, không phải là phiên bản đầu tiên. cũng EditText luôn luôn là một trường hợp mới mà không có bất kỳ watcher đính kèm. và không; EditText không được định nghĩa tĩnh. – SimonSays

7

Giải pháp là di chuyển addTextChangedListener của bạn sang phương thức onPostCreate. tất cả sẽ được giải quyết.

+0

đã được thuận tiện (trong một mảnh) cho tôi để kiểm tra "isResumed()" và chỉ trả lời onTextChanged trong trường hợp này, dường như làm các trick – hmac

+0

Đã không làm việc cho tôi –

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