프로그래밍 언어/Java

[Android java] addTextChangedListener onText/afterText 차이

happy_life 2021. 11. 2. 11:29
XML 코드
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

   <EditText
       android:id="@+id/EditText_number"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
      android:hint="숫자를 입력하세요"
       android:inputType="number"
       >

   </EditText>
</LinearLayout>


 

java 코드
package com.example.forcode;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    private final String TAG = MainActivity.class.getSimpleName();

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

        EditText_number = findViewById(R.id.EditText_number);

        EditText_number.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                Log.d(TAG,"BeforeTextchanged!!");
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                Log.d(TAG,"onTextchanged!!");
            }

            @Override
            public void afterTextChanged(Editable s) {
                Log.d(TAG,"afterTextchanged!!");
            }
        });
    }
}

 

값이 입력되는 것에 따라 3가지의 TextChanged 메소드들이 어떻게 동작하는지 보기 위해

각각의 메소드 아래에 Log.d 코드를 넣어주었습니다.

 

 

beforeTextChanged

 

onTextChanged

afterTextChanged

 

인자가 없을 경우, beforeTextChanged -> onTextChanged -> afterTextChanged 순서대로 메소드가 실행되는 것을 알 수 있습니다.

 

TextWatcher 인터페이스  구현 함수들

■ beforeTextChanged(CharSequence s. int start, int count, int after)

 

CharSequece s : 현재 EditText에 입력된 값

int start : s에 저장된 문자열에서 새로 추가될 문자열의 시작 위치 값

int count : s에 새로운 문자열이 추가된 후 문자열의 길이

int after : 새로 추가될 문자열의 길이

 

 

■ onTextChanger(CharSequence s, int start, int before, int count)

 

start 위치에서 before 문자열 개수만큼 문자열이 count 개수만큼 변경되었을 때 호출

 

CharSequence s : 새로 입력한 문자열이 추가된 EditText의 값을 가지고 있음

int start : 새로 추가된 문자열의 시작 위치 값

int before : 삭제된 기존 문자열의 개수

int count : 새로 추가된 문자열의 개수 

 

 

■ afterTextChanged(Editable a)

 

EditText의 Text가 변경된 것을 다른 곳에 통보할 때 사용됩니다. a.toString()을 통해 현재 EditText의 Text 값을 불러오는 게 가능합니다.  

 

체크 java코드 

package com.example.forcode;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    private final String TAG = MainActivity.class.getSimpleName();

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

        EditText_number = findViewById(R.id.EditText_number);

        EditText_number.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                Log.d(TAG,"BeforeTextchanged!!");
                Log.d(TAG,"BeforeTextchanged CharSequence s:"+String.valueOf(s));
                Log.d(TAG,"BeforeTextchanged int start:"+String.valueOf(start));
                Log.d(TAG,"BeforeTextchanged int count:"+String.valueOf(count));
                Log.d(TAG,"BeforeTextchanged int after:"+String.valueOf(after));
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                Log.d(TAG,"onTextchanged!!");
                Log.d(TAG,"onTextchanged CharSequence s:"+String.valueOf(s));
                Log.d(TAG,"onTextchanged int start:"+String.valueOf(start));
                Log.d(TAG,"onTextchanged int before:"+String.valueOf(before));
                Log.d(TAG,"onTextchanged int count:"+String.valueOf(count));


            }

            @Override
            public void afterTextChanged(Editable s) {
                Log.d(TAG,"afterTextchanged!!");
                Log.d(TAG,"afterTextchanged Editable s:"+String.valueOf(s));
            }
        });
    }
}

각각의 인자들이 무엇인지 체크해보기위해 Log를 작성해보았습니다.

안드로이드에서 123을 입력하였습니다.

 

CharSequence s

1이 입력된 경우

여기서 before 의 charsequence  s 에 주목해보면

1이 입력되기전 빈칸일 때를 s의 값으로 집어 넣는다는 것을 알 수 있습니다.

반면 on의 charsequence s는 1값을 집어 넣고 있고 after도 1을 집어 넣고 있네요

 

2도 마찬가지입니다.

before 은 s에 2가 입력되기전 1을 입력값으로 집어넣고 있고

on과 after는 2가 입력된 후인 12를 입력값으로 집어넣습니다.

 

 

 

int start

1이 입력된 경우

before의 int start 는 0

on의 int start 는 0

 

2가 입력된 경우

before의 int start 는 1

on의 int start 는 1

 

3가 입력된 경우

before의 int start 는 2

on의 int start 는 2

 

s에 저장된 문자열에서 새로 추가될 문자열의 시작 위치 값인 int start는 

before 과 on이 같은 값을 집어넣는다는 것을 알 수 있습니다.

위치 값은 인덱스와 관계되므로 0부터 시작하는 걸 알 수 있습니다.

 

 

 

int count

1이 입력된 경우

before의 int count는 0

on의 int count는 1

 

2가 입력된 경우

before의 int count는 0

on의 int count는 1

 

3가 입력된 경우

before의 int count는 0

on의 int count는 1

 

새로 추가된 문자열의 개수인 int count는

하나씩 숫자를 추가했다는 점에서 on이 1을 입력값으로 집어넣는 것입니다.

하지만 before의 경우 0을 도출합니다.

 

 

 

 

int after

 

새로 추가될 문자열의 길이이므로 after은 1이 도출됩니다.

(1,2,3 모두 길이 1)

 

int before 

 

 이번 예시 코드에선 모두 0이 출력되었는데, 이는 제가 삭제한 것이 없기 때문입니다. 

 

 

이와 같이 addTextChangedListener 를 알아보았습니다.

구글링을 해봐도, addTextChangedListener의 메소드 간의 차이를 설명해주는 것이 구체적으로

나타나있지 않아 직접해보았습니다.

결국 받은 값을 전달해주는 것이 아니라면, before , on ,after 아무거나 사용해도 됩니다.

 

도움이 되셨다면 좋아요 부탁드립니다~