반응형

안드로이드의 EditText의 내용이 변경 될 때 이벤트를 수신 하는 방법입니다.


1. TextWatcher 를 이용하는 방법
보통 afterTextChanged 에 필요한 루틴을 넣어서 사용을 많이 하죠.

이 방법이면 어지간하면 모두 사용이 가능한데요.

리스트뷰나 리사이클뷰 안에 EditText가 들어간 경우는 체크가 힘들어 집니다.

왜나하면 컨트럴을 재사용하기 때문에 어느 항목에서 변경 되었는지 알수가 없게 됩니다.

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

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// 입력되는 텍스트에 변화가 있을 때
}

@Override
public void afterTextChanged(Editable arg0) {
// 입력이 끝났을 때
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// 입력하기 전에
}
});

2. EditText 상속 클래스 사용

아래와 같이 EditText를 재정의 해서 사용을 합니다.

그리고 리스트 뷰나 리사이클 뷰 안에서 setTag()로 데이터 객체를 지정해준 뒤 onTextChanged 에서 값을 넣어주면 됩니다. 

(EditText 상속은 안되고 AppCompatEditText 만 가능합니다.)

public class ExEditText extends AppCompatEditText {
public ExEditText(Context context) {
super(context);
}

public ExEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}

public ExEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
super.onTextChanged(text, start, lengthBefore, lengthAfter);

Object tag = getTag();
if(tag != null && tag instanceof MyClass) {
MyClass item = (MyClass)tag;
item.setValue(text.toString());
Log.d("logtag", item.getValue() + " : " + text.toString());
}
}
}

보통의 리스너 들은 호출 한 View와 변경값이 같이 들어와서 신경 쓸 게 없는데, EditText 내용 변경은 watcher를 add하는 방식이고, 이 watcher 이벤트가 발생될 때 EditText의 참조값이 넘어오지 않아 애를 먹었었네요.

반나절 정도 고민하다 위 방법을 생각해 해결을 보았네요. ^^


반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기