본문 바로가기

FrontEnd/Android 기초

[Android] TextWatcher 사용법(feat.addTextChangedListener)

반응형

TextWatcher 사용법(feat.addTextChangedListener)

- addTextChangedListener 와 TextWatcher 를 이용한 EditText 입력 변화 이벤트 처리  -

 

EditText에 사용자가 텍스트를 입력할때 바로 검색이 되게 하게 하는 기능, 즉 입력 시점에 따라 이벤트를 주는 방법, 입력한 값을 실시간으로 관찰하면서 입력값에 따른 처리를 하는 방법. 

addTextChangedListener 와 TextWatcher를 이용하는것이다.

 

사용방법은 매우 간단하다.

addTextChangedListener 에 TextWatcher라는 인터페이스를 연결해주면 끝이다.

일단 인터페이스이기 때문에 구현하면 TextWacher가 갖고 있는 모든 메서드르르 재정의 해야하는데, TextWatcher에는 아래 3가지 메서드가 있다.

 

  • beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
  • onTextChanged(CharSequence charSequence, int i, int i1, int i2)
  • afterTextChanged(Editable editable)

자동완성되는 코드는 하기와 같다.

 
EditText editsearch = findViewById(R.id.editsearch);

   editsearch.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 arg0) {
       // 입력이 끝났을 때 발동
   }

});

 

기본적으로 이런식으로 처리를해주며,

변화와 동시에 처리를 해주고자 할 때는 onTextChanged() 부분에

입력이 끝났을 때 처리는 afterTextChanged() 부분

입력하여 변화가 생기기 전에 처리는 beforeTextChanged() 부분에

작성을 해주면 된다.

 

우리는 여기서 키워드 검색 EditText에 글자를 쓸때마다, 자동으로 해당 검색어를 가져와서, DB에서 쿼리하여 검색 결과를 화면에 표시해주는 기능을 개발할 것이다. 

즉, 옆측에 잇는 돋보기를 클릭하지 않아도 작동한다는 뜻.

 
editSearch.addTextChangedListener(new TextWatcher() {
   @Override
   public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
       
   }

   @Override
   public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

   }

   @Override
   public void afterTextChanged(Editable editable) {
       // 키워드 검색 에드티텍스트에 글자를 쓸때마다,
       // 자동으로 해당 검색어를 가져와서, 디비에서 쿼리해서
       // 검색 결과를 화면에 표시해주는 기능개발.
       // 옆에있는 돋보기 버튼 누르지 않아도.

       String keyword = editSearch.getText().toString().trim();

// 2글자 이상일 때만 반응하게 하고싶다.

       if(keyword.length()< 2){
           return; // 예외상황을 먼저 작성해라.
       }

       Log.i("MyMemoApp",keyword);

       DatabaseHandler db = new DatabaseHandler(MainActivity.this);
       memoList = db.searchMemo(keyword);
       adapter = new MemoAdapter(MainActivity.this,memoList);
       recyclerView.setAdapter(adapter);

   }
});

 

결과물:

 


beforeTextChanged와 onTextChanged비교: 

 

(스택플로우에서 가져온 예시)

첫 글자 입력 시에는 반응하지 않다가 두 번째 글자가 입력되자 처음에 입력했던 글자를 텍스트뷰에 보여주는 걸 볼 수 있다.

그리고 입력했던 문자열들을 하나씩 지울 때마다 지우기 전의 글자가 보인다.

저기서 start, count, after가 의미하는 건 아래와 같다.

 

  • start : 붉게 강조된 텍스트의 시작 인덱스
  • count : 붉게 강조된 텍스트의 길이
  • after : 녹색으로 강조된 텍스트의 길이

 

즉 문자열(charSequence)이 start 위치로부터 count 만큼의 길이(after)로 변경되려고 한다는 내용을 전달하는 메서드다.

여기서 i가 start, i1이 count, i2가 after란 걸 알 수 있다.

 

반응형