Đếm số ký tự trong EditText Thay đổi người nghe


272

Trong dự án của tôi, tôi có một EditText. Tôi muốn đếm các ký tự trong EditTextvà hiển thị số đó trong a TextView. Tôi đã viết mã sau đây và nó hoạt động tốt. Tuy nhiên, vấn đề của tôi là khi tôi nhấp vào Backspacenó, nhưng tôi cần giảm số. Làm thế nào tôi có thể xem xét Backspace?

tv = (TextView)findViewById(R.id.charCounts);
textMessage = (EditText)findViewById(R.id.textMessage);
textMessage.addTextChangedListener(new TextWatcher(){
    public void afterTextChanged(Editable s) {
        i++;
        tv.setText(String.valueOf(i) + " / " + String.valueOf(charCounts));
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after){}
    public void onTextChanged(CharSequence s, int start, int before, int count){}
}); 

36
Xin vui lòng tha thứ cho sự không liên quan nhưng tôi tò mò làm thế nào bạn đặt "backspace" trong định dạng câu hỏi của bạn? Tôi đã hỏi những câu hỏi tương tự trong đó kỹ thuật đó sẽ rất hữu ích.
AlleyOOP

59
Đặt từ của bạn (trong trường hợp này là Backspace) giữa các thẻ <kbd> </ kbd>, chẳng hạn như: <kbd> Backspace </ kbd>
Hesam

2
Bất cứ khi nào bạn thấy định dạng thú vị (như "backspace"), bạn luôn có thể nhấp vào liên kết "chỉnh sửa" để xem tác giả đã làm như thế nào. Sau đó chỉ cần nhấp vào "hủy" để loại bỏ chỉnh sửa của bạn.
Suragch

Câu trả lời:


142

Sử dụng

s.length()

Sau đây đã từng được đề xuất trong một trong những câu trả lời, nhưng nó rất không hiệu quả

textMessage.getText().toString().length()

38

làm thế nào về việc chỉ cần lấy chiều dài của char trong EditText của bạn và hiển thị nó?

một cái gì đó dọc theo dòng

tv.setText(s.length() + " / " + String.valueOf(charCounts));

6
Nó thậm chí còn dễ dàng hơn thế - bạn chỉ cần gọi textMessage.length(), không cần phải làm getText().toString(). developer.android.com/reference/android/widget/ từ
Yoni Samlan

28

một vài thay đổi trong mã của bạn:

TextView tv = (TextView)findViewById(R.id.charCounts);
textMessage = (EditText)findViewById(R.id.textMessage);
textMessage.addTextChangedListener(new TextWatcher(){
    public void afterTextChanged(Editable s) {
        tv.setText(String.valueOf(s.toString().length()));
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after){}
    public void onTextChanged(CharSequence s, int start, int before, int count){}
}); 

1
Điều này sẽ không hoạt động như văn bản - length () trả về một int và setText mong đợi một Chuỗi
Martin Lockett

1
@MartinLockett sử dụng Integer.toString (int_type) để chuyển đổi chuỗi thành int.
Mehdi Rostami

6

Đây là một câu trả lời chung chung hơn một chút với nhiều lời giải thích hơn cho người xem trong tương lai.

Thêm một văn bản thay đổi người nghe

Nếu bạn muốn tìm độ dài văn bản hoặc làm một cái gì đó khác sau khi văn bản đã được thay đổi, bạn có thể thêm một trình nghe thay đổi văn bản vào văn bản chỉnh sửa của bạn.

EditText editText = (EditText) findViewById(R.id.testEditText);
editText.addTextChangedListener(new TextWatcher() {

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

    }

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

    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
});

Người nghe cần có một TextWatcher, mà đòi hỏi phải có ba phương pháp để được ghi đè: beforeTextChanged, onTextChanged, và afterTextChanged.

Đếm các ký tự

Bạn có thể nhận được số lượng nhân vật trong onTextChangedhoặc beforeTextChangedvới

charSequence.length()

hoặc trong afterTextChangedvới

editable.length()

Ý nghĩa của các phương pháp

Các thông số hơi khó hiểu nên đây là một lời giải thích thêm.

trướcText Thay đổi

beforeTextChanged(CharSequence charSequence, int start, int count, int after)

  • charSequence: Đây là nội dung văn bản trước khi thay đổi chờ xử lý được thực hiện. Bạn không nên cố gắng thay đổi nó.
  • start: Đây là chỉ mục nơi văn bản mới sẽ được chèn. Nếu một phạm vi được chọn, thì đó là chỉ mục bắt đầu của phạm vi.
  • count: Đây là độ dài của văn bản được chọn sẽ được thay thế. Nếu không có gì được chọn thì countsẽ được 0.
  • after: đây là chiều dài của văn bản được chèn.

onText Thay đổi

onTextChanged(CharSequence charSequence, int start, int before, int count)

  • charSequence: Đây là nội dung văn bản sau khi thay đổi được thực hiện. Bạn không nên cố gắng sửa đổi giá trị này ở đây. Sửa đổi editabletrong afterTextChangednếu bạn cần.
  • start: Đây là chỉ mục bắt đầu nơi văn bản mới được chèn.
  • before: Đây là giá trị cũ. Đó là độ dài của văn bản được chọn trước đó đã được thay thế. Đây là giá trị tương tự như counttrong beforeTextChanged.
  • count: Đây là độ dài của văn bản đã được chèn. Đây là giá trị tương tự như aftertrong beforeTextChanged.

afterText Thay đổi

afterTextChanged(Editable editable)

Giống như onTextChanged, điều này được gọi sau khi thay đổi đã được thực hiện. Tuy nhiên, bây giờ văn bản có thể được sửa đổi.

  • editable: Đây là văn bản có thể chỉnh sửa của EditText. Tuy nhiên, nếu bạn thay đổi nó, bạn phải cẩn thận để không đi vào một vòng lặp vô hạn. Xem tài liệu để biết thêm chi tiết.

Hình ảnh bổ sung từ câu trả lời này

nhập mô tả hình ảnh ở đây


0

TextWatcher maritalStatusTextWatcher = new TextWatcher () {@Override void công khai trướcTextChanged (CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        try {
            if (charSequence.length()==0){
                topMaritalStatus.setVisibility(View.GONE);
            }else{
                topMaritalStatus.setVisibility(View.VISIBLE);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
};
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.