Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Đếm ký tự trong EditText bằng TextWatcher trong Android

Mục tiêu

Giới hạn số ký tự nhập vào EditText (ví dụ max 5 ký tự) và hiển thị lỗi khi vượt quá.

Cách làm: TextWatcher

Bước 1: Tạo project

Bước 2: Layout activity_main.xml

<LinearLayout ... android:gravity="center" android:background="#33FFFF00" android:orientation="vertical">
    <EditText android:id="@+id/text" android:textSize="18sp" android:layout_width="match_parent" android:layout_height="wrap_content" />
</LinearLayout>

Bước 3: MainActivity.java

public class MainActivity extends AppCompatActivity {
    EditText editText;
    private static final int MAX_LENGTH = 5;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = findViewById(R.id.text);

        editText.addTextChangedListener(new TextWatcher() {
            @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) {
                if (s.length() > MAX_LENGTH) {
                    editText.setError("Chỉ cho phép " + MAX_LENGTH + " ký tự");
                } else {
                    editText.setError(null);
                }
            }
        });
    }
}

3 callback của TextWatcher:

  • beforeTextChanged: Trước khi text thay đổi (chưa áp dụng).
  • onTextChanged: Khi text đang thay đổi.
  • afterTextChanged: Sau khi text đã thay đổi (an toàn để sửa đổi EditText).

→ Nên dùng afterTextChanged để validate/setError.

Kết quả

Nhập ≤ 5 ký tự: bình thường.

Nhập > 5 ký tự: Hiện error đỏ dưới EditText:

Đếm ký tự trong EditText bằng TextWatcher trong Android

Mở rộng

  • Hiển thị counter: TextInputLayout với app:counterEnabled="true" app:counterMaxLength="5".
  • Ngăn nhập vượt quá: InputFilter.LengthFilter(5).
  • editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(5)});