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를 작성해보았습니다.
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 아무거나 사용해도 됩니다.
도움이 되셨다면 좋아요 부탁드립니다~
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Android] Build was configured to prefer settings repositories over project repositories but repository 'maven' was added by build file 'app\build.gradle' 오류 해결 (0) | 2021.11.04 |
---|---|
java 5강 생성자란? (0) | 2021.11.03 |
java 4강 this 란 무엇인가요? (0) | 2021.10.29 |
Android TextInputEditText hint color 변경하는 방법 (0) | 2021.10.28 |
java.lang.NumberFormatException: empty String 에러 해결 (0) | 2021.10.26 |