안드로이드의 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의 참조값이 넘어오지 않아 애를 먹었었네요.
반나절 정도 고민하다 위 방법을 생각해 해결을 보았네요. ^^
'안드로이드' 카테고리의 다른 글
Android Version List (1) | 2021.11.14 |
---|---|
Android RecyclerView StaggeredGrid (0) | 2021.11.14 |
Android RecyclerView (0) | 2021.11.14 |
TextView Center Line(취소선, 텍스트 중간에 줄긋기 옵션) (0) | 2017.11.24 |
RoundRect Background xml 만들기 (0) | 2017.11.23 |
최근댓글