android edittext onchange nghe


115

Tôi biết một chút về TextWatchernhưng điều đó bùng phát trên mọi nhân vật bạn nhập vào. Tôi muốn một trình nghe kích hoạt bất cứ khi nào người dùng hoàn thành việc chỉnh sửa. Nó có khả thi không? Cũng trong TextWatchertôi nhận được một trường hợp của Editablenhưng tôi cần một trường hợp của EditText. Làm thế nào để tôi có được điều đó?

CHỈNH SỬA : câu hỏi thứ hai quan trọng hơn. Hãy trả lời rằng.


1
cố gắng thêm người nghe tập trung, khi EditText mất tập trung, điều đó có nghĩa rằng người dùng đã bắt đầu chỉnh sửa nó, và khi EditText mất tập trung, nó có nghĩa là chỉnh sửa là xong
Houcine

Câu trả lời:


214

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

BIÊN TẬP:

Để có thể đưa EditTextphiên bản vào TextWatchertriển khai của bạn , bạn nên thử một cái gì đó như sau:

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 mẫu trên có thể có một số lỗi nhưng tôi chỉ muốn cho bạn xem một ví dụ.


17

Tôi thấy phiền rằng việc triển khai trình lắng nghe cho tất cả các trường EditText của tôi yêu cầu tôi phải có mã dài dòng, xấu xí nên tôi đã viết lớp dưới đây. Có thể hữu ích cho bất cứ ai tình cờ gặp phải đ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 lắng nghe đã gọn gàng 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 tần suất nó kích hoạt, người ta có thể thực hiện kiểm tra để chạy mã mong muốn của họ //Do stuffsau một


Điều này hoạt động rất tốt đối với tôi, tiết kiệm rất nhiều dòng mã! Bạn là thiên tài!
huypham99

12

Bất kỳ 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) {

}

6

Tôi đã thực hiện nó bằng cách sử dụng 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());
    }

});

3
 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 thứ không cần thiết} ở cuối
Howard

2

TextWatcherkhông hiệu quả đối với tôi vì nó tiếp tục kích hoạt mọi thứ EditTextvà làm xáo trộn các giá trị của nhau.

Đâ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 getChildAt(xx)phương pháp này, bạn có thể lấy bất kỳ mục nào trong ListViewvà lấy từng mục bằng cách sử dụng findViewById. Và sau đó nó sẽ đưa ra giá trị gần đây nhất.


1

Theo như tôi có thể nghĩ về nó, chỉ có hai cách bạn có thể làm. Làm thế nào bạn có thể biết người dùng đã viết xong một từ? Khi bị mất tiêu điểm hoặc nhấp vào nút "ok". Tôi không có cách nào để 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 một nút và một người nghe nhấp vào nó.


0

Phương thức Watcher kích hoạt trên mọi đầu vào ký tự. Vì vậy, tôi đã xây dựng mã này dựa trên phương thức onFocusChange:

public static boolean comS(String s1,String s2){
    if (s1.length()==s2.length()){
        int l=s1.length();
        for (int i=0;i<l;i++){
            if (s1.charAt(i)!=s2.charAt(i))return false;
        }
        return true;
    }
    return false;
}

public void onChange(final EditText EdTe, final Runnable FRun){
    class finalS{String s="";}
    final finalS dat=new finalS();  
    EdTe.setOnFocusChangeListener(new OnFocusChangeListener() {          
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {dat.s=""+EdTe.getText();}
            else if (!comS(dat.s,""+EdTe.getText())){(new Handler()).post(FRun);}       
        }
    });
}

Để sử dụng nó, chỉ cần gọi như thế này:

onChange(YourEditText, new Runnable(){public void run(){
    // V  V    YOUR WORK HERE

    }}
);

Bạn có thể bỏ qua hàm comS bằng cách thay thế! ComS (dat.s, "" + EdTe.getText ()) bằng! Bằng hàm. Tuy nhiên, bản thân hàm bằng một số thời gian hoạt động không chính xác trong thời gian chạy.

Trình nghe onChange sẽ nhớ dữ liệu cũ của EditText khi người dùng nhập tiêu điểm và sau đó so sánh dữ liệu mới khi người dùng mất tiêu điểm hoặc chuyển sang đầu vào khác. Nếu so sánh Chuỗi cũ không giống với Chuỗi mới, nó sẽ kích hoạt công việc.

Nếu bạn chỉ có 1 EditText, thì bạn sẽ cần tạo chức năng ClearFocus bằng cách tạo một Micro EditText trong suốt bí mật tối thượng 😸 bên ngoài cửa sổ 😽 và yêu cầu lấy tiêu điểm vào nó, sau đó ẩn bàn phím qua Trình quản lý phương thức nhập.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.