마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

addTextChangedListener TextWatcher로 현재 EditText 설정시

0 추천

안녕하세요 현재 안드로이드 공부중인 학생입니다. 구글링을 하여도 안나오는 문제가 있어 질문글을 올립니다.

현재 EditText hour을 통해서 13을 입력시에 "오후"  " 1 " 이렇게 변하게 만들려고 하는데 

hour에 있는 값을 모두 지우면 튕기고 

13이상 값을 입력 받으면 "오후" "1" 이런 느낌으로 표시되야 되는데 13이상 값을 받아도 튕깁니다.

 

혹시 제가 잘못 사용하고 있는 건가요?

그리고 추가적으로 24이상 값을 받았을때는 입력이 되지 않게도 만들고 싶은데 어떻게 구현해야할지 모르겠네요. 이것까지 알려 주신다면 정말 감사하겠습니다.

GomPro (170 포인트) 님이 2019년 9월 5일 질문

2개의 답변

+1 추천

1. hour에 있는 값을 모두 지우면 튕기고

=> editable.toString 값이 빈값인  "" 이 나올텐데. 이걸 Interger.parseInt() 로 부르니 처리 못 해서 Exception 발생 한 듯 합니다.

String message = editable.toString();

if (!TextUtil.isEmpty(message)) {

   if(Interger.parseInt(message) {

  .... 

}

와 같이 빈 값이 아닐 경우에만 이후 로직을 수행하게 하세요.

 

2. 13이상 값을 입력 받으면 "오후" "1" 이런 느낌으로 표시되야 되는데 13이상 값을 받아도 튕깁니다.

=> et_hour.setText(Integer.parseInt(editable.toString) -12);  부분이 문제입니다.

setText(int) 메소드가 호출 될텐데  이 메소드는  int 값이 설정 되는게 아니라 int 값에 해당하는 리소스 값이 설정됩니다.

즉 13입력 되면  리소스 Id가 1인 값을 설정하려 할텐데. 없으니 오류가 날 수 밖에 없습니다.

et_hour.setText(""+(Integer.parseInt(editable.toString) -12));  나 

et_hour.setText(Integer.toString(Integer.parseInt(editable.toString) -12));  같이 명시적으로 String으로 변경 해 주셔야 합니다.

 

3.  추가적으로 24이상 값을 받았을때는 입력이 되지 않게도 만들고 싶은데 어떻게 구현해야할지 모르겠네요

=> 필터를 주시는게 깔끔 할 듯 합니다. 아래 경로를 확인 해 보세요.

https://stackoverflow.com/questions/14212518/is-there-a-way-to-define-a-min-and-max-value-for-edittext-in-android

 

PS. 지금 구조로는 텍스트 변경 이벤트를 부른 이후 setText 를 다시 부르시다보니 텍스트 변경 이벤트가 다시 불려 무한 루핑 걸릴 듯 합니다.

https://stackoverflow.com/questions/33257937/edittext-addtextchangedlistener-only-for-user-input 를 참조해서 사용자가 입력할 때만 처리하게 변경 하시는게 좋을 듯 합니다.

익명사용자 님이 2019년 9월 5일 답변
2019년 9월 5일 수정
0 추천
입력 란이 비었을 때 아무 일도 하지 않게 처리하시고,

저기서 그냥 글자를 바꾸면, 글자가 바뀌었으니 저 함수가 또 호출이 됩니다. 아마 stackoverflow 오류가 날 거예요.

그러니 text watcher를 끊고, 글자를 바꾸고, 다시 text watcher를 연결하시면 됩니다.

 

나머지 오류는 에러로그 찬찬히 읽어보면 답이 나올 거고, 24 이상 무시 같은 건 숫자로 바꿔서 24 이상이면 비우게 해놓으면 됩니다.
쎄미 (162,410 포인트) 님이 2019년 9월 5일 답변
혹시 TextWatcher를 한번 끊고 다시 연결하라고 말씀하셨는데 어떻게 끊고 다시 연결해야 될지 전혀 감이 안와서 다시 질문드립니다.
혹시 TextWatcher를 어떻게 다시 끊고 연결해야되죠?
private TextWatcher watcher  = new TextWathcher(){} 로 따로 만들고, et_hour.addTextChangeListener(watcher), et_hour.removeTextChangeListener(watcher) 로 하면 됩니다.
...