2011년 8월 26일 금요일

Android - EditText 값 입력 제어 (TextWatcher 사용)

TextWatcher

사용 목적
 - EditText에 값이 입력되는 경우 입력 값의 유효성을 검증하여 입력할지 말지를 결정 한다거나.
  값이 입력될때 무언가를 해주고 싶을때 사용한다.

기타 자세한 설명은...
http://developer.android.com/reference/android/text/TextWatcher.html
를 참고


설명을 보면 알겠지만 TextWatcher 는 interface로 아래 3개의 method를 가지고 있다.

public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}


@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}


@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}



사용 예는 아래와 같다

EditText et = new EditText();
et.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
Log.w("onTextChanged", s.toString());
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
Log.w("onTextChanged", s.toString());
}

@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
Log.w("onTextChanged", s.toString());
}
});

위와 같이 하면 et 에 값을 입력할때마다 log가 찍힌다.


본인 같은 경우에는 월(month)를 입력받는 EditText를 만들때 사용했다.
1~12월 사이의 숫자만 입력되야 하기 때문에 아래와같이 코딩했다.

TextWatcher를 상속받은 MonthTextWatcher 를 정의하여 제어 함.

//editTextBeginMonth 는 EditText


MonthTextWatcher endWatcher = new MonthTextWatcher(editTextEndMonth);
editTextBeginMonth.addTextChangedListener(beginWatcher);






//month EditText에 12를 초과하는 값이 못들어가게 제어
private class MonthTextWatcher implements TextWatcher{
EditText et;
String beforeText;

public MonthTextWatcher(EditText et){
this.et = et;
}

@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if(s.toString().length() > 0){
if(Integer.parseInt(s.toString()) > 12){
et.setText(beforeText);
}
}
}


@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
beforeText = s.toString();
}


@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}

}