티스토리 뷰

728x90

 


Text Changed Listener

• 안드로이드의 EditText 위젯을 사용할 경우, EditText에서 입력되거나 변경되는 텍스트를 Text Changed Listener를 통해 코틀린으로 받아올 수 있다.

• 받아온 텍스트를 데이터로 활용할 수 있다.

• 변경되는 텍스트를 실시간으로 확인하여 올바른 형식으로 텍스트를 입력했는지 등을 확인할 수 있다.

 

* EditText 위젯을 다룬 게시글 : [📱Android/🔍UI] - 14. EditText

 

[Android/UI] 14. EditText

EditText • 사용자가 텍스트를 직접 입력할 수 있는 위젯 • 입력한 값을 저장하여 데이터로 사용할 수 있다. ex) Id, Password, 개인정보 등 • 속성 - text : 미리 내용을 채워넣을 수 있다. - hint : 연한

apro-developer.tistory.com

 

1. addTextChangedListener 사용

• EditText 클래스의 addTextChangedListener(TextWatcher) 메소드 사용

     - TextWatcher 클래스의 beforeTextChanged, onTextChanged, afterTextChanged 메소드를 사용

     - 각각 텍스트의 변경 전, 변경 중, 변경 후의 값을 얻을 수 있다.

• 단점

     - TextWatcher 객체를 한 번 더 만들어야 한다.

     - 매개 변수 이름이 p0, p1 등의 이름으로 되어있는 안드로이드 버전이 많다.

     - beforeTextChanged, onTextChanged, afterTextChanged 메소드를 모두 오버라이드하여 구체화 해주어야 한다.

     -> 불편함.

package com.example.fastcampus

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.util.Log
import android.widget.EditText

class EditTextTest : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_edit_text_test)

        val editText_name: EditText = findViewById<EditText>(R.id.name)
        val editText_age: EditText = findViewById<EditText>(R.id.age)

        // addTextChangedListener 사용
        editText_name.addTextChangedListener(object: TextWatcher { // TextWatcher 익명 객체 생성
            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { // beforeTextChanged 오버라이드 : 이름으로 유추하기 어려운 매개 변수
                Log.d("testt", "beforeTextChanged : " + p0)
                // 글자가 변경되기 전
            }

            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { // onTextChanged 오버라이드
                Log.d("testt", "onTextChanged : " + p0)
                // 글자가 변경되는 중
            }

            override fun afterTextChanged(p0: Editable?) { // afterTextChanged 오버라이드
                Log.d("testt", "afterTextChanged : " + p0)
                // 글자가 변경되고 후
            }
        })
    }
}

addTextChangedListener로 텍스트의 변경을 리스닝하여 로그캣에 출력한 모습

 

2. 람다 함수 사용

• EditText의 doBeforeTextChanged, doOnTextChanged, doAfterTextChanged 메소드 사용.

• 모든 메소드를 구현할 필요없이 필요한 메소드만 사용하면 된다.

• 매개 변수 이름으로 기능을 유추할 수 있다.

• 객체를 하나 더 만들 필요가 없다.

package com.example.fastcampus

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.util.Log
import android.widget.EditText
import android.widget.TextView
import androidx.core.widget.doAfterTextChanged
import androidx.core.widget.doBeforeTextChanged
import androidx.core.widget.doOnTextChanged

class EditTextTest : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_edit_text_test)

        val editText_name: EditText = findViewById<EditText>(R.id.name)
        val editText_age: EditText = findViewById<EditText>(R.id.age)

        // addTextChangedListener 사용
        editText_name.addTextChangedListener(object: TextWatcher {
            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                Log.d("testt", "beforeTextChanged : " + p0)
            }

            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                Log.d("testt", "onTextChanged : " + p0)
            }

            override fun afterTextChanged(p0: Editable?) {
                Log.d("testt", "afterTextChanged : " + p0)
            }
        })

        // 람다 함수 사용
        editText_age.doBeforeTextChanged { text, start, count, after ->  Log.d("testt", "doBeforeTextChanged : " + text)}
        editText_age.doOnTextChanged { text, start, before, count -> Log.d("testt", "doOnTextChanged : " + text)}
        editText_age.doAfterTextChanged { text -> Log.d("testt", "doAfterTextChangedt : " + text)}
    }
}

람다 함수로 텍스트의 변경을 리스닝하여 로그캣에 출력한 모습

 

 

 

 

 

 

 

 

이 글은

패스트 캠퍼스 Android 앱 개발의 정석 with Kotlin 올인원 패키지 Online

강의를 듣고 공부한 내용을 바탕으로 작성되었습니다.

 


728x90
댓글
공지사항