Android 앱을 개발하다 보면 EditText에 입력할 수 있는 글자 수를 제한해야 하는 경우가 종종 있습니다. 예를 들어 닉네임, 인증 코드, 짧은 메모 등을 입력받을 때 특정 글자 수 이상 입력되지 않도록 막아야 하죠. 이번 튜토리얼에서는 TextWatcher를 활용해 EditText의 입력 문자 수를 실시간으로 확인하고, 일정 글자 수를 초과하면 오류 메시지를 표시하는 방법을 알아보겠습니다.
1단계: 새 프로젝트 생성
Android Studio에서 File → New Project를 선택하고, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.
2단계: 레이아웃 파일 작성
res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.
<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android"
android:id = "@+id/parent"
xmlns:tools = "https://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".MainActivity"
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>위 코드에서는 하나의 EditText를 배치했습니다. 이 EditText는 사용자가 입력한 문자의 길이를 검사하며, 글자 수가 5자를 초과하면 오류 메시지를 표시합니다.
3단계: MainActivity 코드 작성
src/MainActivity.java 파일에 아래 코드를 추가합니다.
package com.example.andy.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
int view = R.layout.activity_main;
EditText text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(view);
text = findViewById(R.id.text);
text.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.toString().length()>5) {
text.setError("It allows only 5 character");
}else{
text.setError(null);
}
}
});
}
}코드 설명
위 코드의 핵심은 addTextChangedListener() 메서드입니다. EditText에 TextWatcher를 등록하면 텍스트가 변경될 때마다 아래 세 가지 콜백 메서드가 순서대로 호출됩니다.
- beforeTextChanged(): 텍스트가 변경되기 직전에 호출됩니다.
- onTextChanged(): 텍스트가 변경되는 순간 호출됩니다.
- afterTextChanged(): 텍스트 변경이 완료된 후 호출됩니다.
이 예제에서는 afterTextChanged()에서 최종 입력된 텍스트의 길이를 검사합니다. 글자 수가 5자를 초과하면 setError()로 오류 메시지를 표시하고, 5자 이하이면 setError(null)을 호출해 오류 표시를 제거합니다.
text.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.toString().length()>5) {
text.setError("It allows only 5 character");
}else{
text.setError(null);
}
}
});앱 실행 및 결과 확인
실제 Android 기기를 컴퓨터에 연결한 후, Android Studio에서 프로젝트의 액티비티 파일 중 하나를 열고 툴바의 Run 아이콘을 클릭해 앱을 실행합니다. 실행할 기기로 자신의 모바일 기기를 선택하면 기본 화면이 표시됩니다.
5자 이내의 문자를 입력하면 아무런 오류도 나타나지 않습니다. 하지만 5자를 초과하는 문자를 입력하면 아래와 같이 오류 메시지가 표시됩니다.


마무리
이처럼 TextWatcher를 사용하면 EditText의 입력 내용을 실시간으로 감시하고 글자 수 제한 같은 유효성 검사를 손쉽게 구현할 수 있습니다. maxLength 속성으로 단순히 입력 자체를 막는 방법도 있지만, setError()를 함께 활용하면 사용자에게 왜 입력이 제한되는지 명확한 피드백을 줄 수 있어 더 나은 사용자 경험을 제공합니다.