안드로이드 공부

[안드로이드 스튜디오] TextWatcher (JAVA/자바)

코메인 2022. 12. 6. 23:47

안녕하세요~ 코딩하는 코알못 코메인입니다.

이번에는 TextWatcher를 사용하는 법을 알아보겠다.

 

TextWatcher는 실시간으로 추가적인 조치 없이 EditText에 입력한 값을 읽어서 바로 적용하게 해주는 인터페이스이다.

 

일반적으로 안드로이드에서 EditText에 값을 입력하고, 버튼을 클릭하는 등의 추가적인 동작으로 EditText에 입력되어진 값을 읽어내고 원하는 동작을 실행할 수 있다. 하지만 TextWatcher를 사용하면 그런 버튼 클릭의 추가 동작 없이도 실시간으로 적용 되게 할 수 있다.

 

방식은 총 3가지가 있다.

beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) 입력 전에

onTextChanged(CharSequence charSequence, int i, int i1, int i2) 입력과 동시에

afterTextChanged(Editable editable) 입력 후에

 

예를 들면 수십개의 연락처가 저장되어 있고, 원하는 연락처를 찾기 위해 검색 기능을 사용 할 것이다.

보통이라면 홍길동이라는 사람의 연락처를 찾으려 이름을 입력하고 검색 버튼을 이용해 홍길동이라는 사람의 연락처가 노출되게 하겠지만, 해당 기능으로 홍길동이란 사람의 이름중 홍을 입력만 해도, 이름에 홍이 들어가는 연락처들이 바로 노출되게 할 수 있다. 물론 해당 기능은 리스트를 동시 활용해야 하기 때문에 다른 방식으로 기능을 구현해서 보여주겠다.

 

해당 인터페이스는 안드로이드 디벨로퍼에서도 확인이 가능하다. 상세 내용은 디벨로퍼에서 마저 확인해보자.

https://developer.android.com/reference/android/text/TextWatcher

 

TextWatcher  |  Android Developers

 

developer.android.com

 

 

사용 방법

 

onclick을 사용하듯 사용해 주면 된다. 입력 할 EditText에 .addTextChangedListenet()를 해주고, ()에 new TextWatcher()을 해주면 되는데 자동 완성을 해주면 세가지의 메소드가 자동으로 채워질 것이다.

	EditText editText = findViewById(R.id.editTextNumber);

        editText.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) {
                
            }
        });

해당 코드 처럼.

 

본 코드로 들어가 보자.

 

코드

우선 xml

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/editTextTextPersonName"
        android:layout_width="336dp"
        android:layout_height="48dp"
        android:ems="10"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.493"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.036" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="336dp"
        android:layout_height="100dp"
        android:freezesText="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.493"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.432" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="336dp"
        android:layout_height="30dp"
        android:freezesText="true"
        android:text="beforeTextChanged"
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.493"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.141" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="336dp"
        android:layout_height="100dp"
        android:freezesText="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.493"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.204" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="336dp"
        android:layout_height="30dp"
        android:text="onTextChanged"
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.493"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.346" />

    <TextView
        android:id="@+id/textView6"
        android:layout_width="336dp"
        android:layout_height="100dp"
        android:freezesText="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.493"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.659" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="336dp"
        android:layout_height="30dp"
        android:text="afterTextChanged"
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.493"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.55" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

 

Activity 코드

 

package com.example.textwatcher;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = findViewById(R.id.editTextTextPersonName);
        TextView before = findViewById(R.id.textView4);
        TextView on = findViewById(R.id.textView5);
        TextView after = findViewById(R.id.textView6);

        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                before.setText(charSequence.toString());
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                on.setText(charSequence.toString());
            }

            @Override
            public void afterTextChanged(Editable editable) {
                after.setText(editable.toString());
            }
        });
    }
}

 

 

실행

실행화면처럼 결과가 나오게 된다. 각 성능에 따라 스스로 필요한 곳에 사용하면 될 것 같다.

 

안드로이드 디벨로퍼 사이트에서 확인하면 알겠지만 메소드에서

(CharSequence charSequence, int i, int i1, int i2)

CharSequence는 말그대로 입력된 값을 말하는 것이고, int i, i1, i2는 시작 글자수, 총 글자 수, 마지막 글자 수에 해당하는 데 onText와 BeforeText가 서로 순서가 다르기 때문에 디벨로퍼 사이트에서 잘 확인해보고 사용하자.

 

안드로이드 스튜디오로 검색기능이나 텍스트 관련 기능을 구현 하고 싶을 때 유용하게 쓰일 수 있는 TextWatcher에대해 알아 보았습니다.

보시는 분들에게 도움이 되셧으면 좋겠고, 만약 보시고 틀린 점이나 추가로 정보를 주고 싶은 분이 있다면 거리낌 없이 댓글로 남겨주시면 감사히 새겨 듣겠습니다.